百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python | 多态(Python多态的简单例子)

off999 2024-10-25 13:42 20 浏览 0 评论

多态体现一,变量可以指向任意数据类型

多态的第一种体现是,不关注对象的数据类型,同一个变量完全可以在不同的时间引用不同的对象

Python 本身就是一种多态语言,不关心对象的类型

  • 对于弱类型的语言来说,变量并没有声明类型,因此同一个变量完全可以在不同的时间引用不同的对象
  • 毫无疑问,在 Python 中,对象是一块内存,内存中除了包含属性和方法之外,还包含了对象类型。我们通过引用来访问对象,比如 a = A()。首先,Python 创建一个对象 A,然后声明一个变量 a,再将变量 a 与对象 A 联系起来。变量 a 是没有类型的,它的类型取决于其关联的对象。
Bash
a = 10
a = 'alex'    # Python中的变量可以随时被赋值任意数据类型

我们曾经谈到过,Python 中的每一个类实际上就是一个数据类型,因此,变量也可以指向不同类的对象:

Bash
class Bird:
    def move(self, field):
        print('鸟儿在%s上自由地飞翔~' % field)
class Dog:
    def move(self, field):
        print('狗狗在%s里飞快地奔跑~' % field)
x = Bird()
x.move('天空')
x = Dog()
x.move('草地')

输出的结果为:

鸟儿在天空上自由地飞翔~
狗狗在草地里飞快地奔跑~

同一个变量 x 在执行同一个 move() 方法时,由于 x 指向的对象不同,因此呈现出不同的行为特征,这就是多态。

多态体现二,一类事物有多种形态(Polymorphic)

一个抽象类有多个子类,但方法实现不同

  • 例如:动物类有多个子类,每个子类都重新实现了父类的某个方法,但方法的实现不同(比如动物类都有休息的方法,但不同的动物休息的方式不尽相同)
  • 此时需要有继承,需要方法重写
class Girl(object):
    def __init__(self, name):
        self.name = name

    def game(self):
        print('%s蹦蹦跳跳地玩耍...' % self.name)


class Nurse(Girl):
    def game(self):
        print('%s脱裤子打针' % self.name)


class Boy(object):
    def __init__(self, name):
        self.name = name

    def game(self, girl):
        print('%s和%s快乐地玩耍' % (self.name, girl.name))
        girl.game()


xiaoming = Boy('小明')
xiaohong = Girl('小红')
xiaoli = Nurse('小丽')

xiaoming.game(xiaohong)
xiaoming.game(xiaoli)

输出的结果为:

小明和小红快乐地玩耍
小红蹦蹦跳跳地玩耍...
小明和小丽快乐地玩耍
小丽脱裤子打针

Nurse 有 Girl 类的方法和属性,是它的子类。方法名虽然相同,但实现的方式略有差异。具有相同父类,继承相同方法,在子类中对父类的方法进行了修改,就是多态的第二种体现。

多态性

多态性(polymorphism)指的是,在多态基础上,定义统一的共同接口(在类的外面定义单独的函数),从而实现使用一个函数调用不同类的同名方法。

不同类的对象作为函数的参数时,因为方法不同,得到的结果也会有差异。

多态性的具体实现方法如下:

class Person:
    def relax(self):
        print('人需要休息')
class Alex:
    def relax(self):
        print('睡觉')
class BigB:
    def relax(self):
        print('买沙发')
        
# 定义一个函数作为访问多个类的relax方法的统一接口
def relax_func(person):
    person.relax()
    
a = Alex()
b = BigB()
p = Person()

relax_func(a)
relax_func(b)
relax_func(p)

输出的结果为:

睡觉
买沙发
人需要休息

鸭子类型

鸭子类型是 Python 中比较推崇的多态的另一种体现形式。

鸭子类型不关心类型,不需要继承,只关注方法的实现,这种情况被称为鸭子类型。

鸭子类型名字的来源于一句话:“当看到一只鸟走起来像鸭子、游起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称作‘鸭子’”。

套用过来就是,当两个类,有同名方法,不管这两个类是干什么用的,也不管它们之间有没有联系(依赖、组合或继承),都可以用同一个接口来调用。

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

比如,人、鸭子、鱼、猪和船都会游泳,但是他们是不同的类,他们之间没有任何联系。而我们却可以在外面定义一个统一的接口来调用他们之间游泳的方法:

class Person:
    def swim(self):
        print('人可以游泳')
class Duck:
    def swim(self):
        print('鸭子会游泳')
class Fish:
    def swim(self):
        print('鱼会游泳')
class Pig:
    def swim(self):
        print('猪会游泳')
class Ship:
    def swim(self):
        print('船会游泳')
   
# 建立鸭子类型
def swimming(obj):
    obj.swim()
    
xiaoming = Person()
xiaohuang = Duck()
paopao = Fish()
peiqi = Pig()
titanic = Ship()

swimming(xiaoming)
swimming(xiaohuang)
swimming(paopao)
swimming(peiqi)
swimming(titanic)

输出的结果为:

人可以游泳
鸭子会游泳
鱼会游泳
猪会游泳
船会游泳

多态总结

Python 是一门天然支持多态的编程语言。

多态增加了程序的灵活性(通用性),以不变应万变,不论对象千变万化,使用者都是使用同一种形式(外部定义的一个函数)去调用。

增加程序的可扩展性,通过继承某个类创建的一个新类,接口使用者无需更改自己的代码,还是用原方法调用。

多态和多态性对比:

多态强调的是,一类事物由不同的形态。

多态性强调的是,同一操作,作用对象不同,表现出不同的实现方式(只关心行为结果)

相关推荐

编写更多 pythonic 代码(十三)——Python类型检查

一、概述在本文中,您将了解Python类型检查。传统上,类型由Python解释器以灵活但隐式的方式处理。最新版本的Python允许您指定显式类型提示,这些提示可由不同的工具使用,以帮助您更...

[827]ScalersTalk成长会Python小组第11周学习笔记

Scalers点评:在2015年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Pytho...

用 Python 画一颗会跳动的爱心:代码里的浪漫仪式感

在编程的世界里,代码不仅是逻辑的组合,也能成为表达情感的载体。今天我们就来聊聊如何用Python绘制一颗「会跳动的爱心」,让技术宅也能用代码传递浪漫。无论是写给爱人、朋友,还是单纯记录编程乐趣,这...

Python面向对象编程(OOP)实践教程

一、OOP理论基础1.面向对象编程概述面向对象编程(Object-OrientedProgramming,OOP)是一种编程范式,它使用"对象"来设计应用程序和软件。OOP的核心...

如何在 Python 中制作 GIF(python做gif)

在数据分析中使用GIF并发现其严肃的一面照片由GregRakozy在Unsplash上拍摄感谢社交媒体,您可能已经对GIF非常熟悉。在短短的几帧中,他们传达了非常具体的反应,只有图片才能传达...

Python用内置模块来构建REST服务、RPC服务

1写在前面和小伙伴们分享一些Python网络编程的一些笔记,博文为《PythonCookbook》读书后笔记整理博文涉及内容包括:TCP/UDP服务构建不使用框架创建一个REST风格的HTTP...

第七章:Python面向对象编程(python面向对象六大原则)

7.1类与对象基础7.1.1理论知识面向对象编程(OOP)是一种编程范式,它将数据(属性)和操作数据的函数(方法)封装在一起,形成一个称为类(Class)的结构。类是对象(Object)的蓝图,对...

30天学会Python编程:8. Python面向对象编程

8.1OOP基础概念8.1.1面向对象三大特性8.1.2类与对象关系核心概念:类(Class):对象的蓝图/模板对象(Object):类的具体实例属性(Attribute):对象的状态/数据方法...

RPython GC 对象分配速度大揭秘(废土种田,分配的对象超给力)

最近,对RPythonGC的对象分配速度产生了浓厚的兴趣。于是编写了一个小型的RPython基准测试程序,试图探究它对象分配的大致速度。初步测试与问题发现最初的设想是通过一个紧密循环来分配实...

30天学会Python编程:2. Python基础语法结构

2.1代码结构与缩进规则定义与原理Python使用缩进作为代码块的分界符,这是Python最显著的特征之一。不同于其他语言使用大括号{},Python强制使用缩进来表示代码层次结构。特性与规范缩进量...

Python 类和方法(python类的方法与普通的方法)

Python类和方法Python类创建、属性和方法具体是如何体现的,代码中如何设计,请继续看下去。蟒蛇类解释在Python中使用OOP?什么是Python类?Python类创建Pyt...

动态类型是如何一步步拖慢你的python程序的

杂谈人人都知道python慢,这都变成了人尽皆知的事情了,但你知道具体是什么拖慢了python的运行吗?动态类型肯定要算一个!动态类型,能够提高开发效率,能够让我们更加专注逻辑开发,使得编程更加灵活。...

用Python让图表动起来,居然这么简单

我好像看到这个emoji:动起来了!编译:佑铭参考:https://towardsdatascience.com/how-to-create-animated-graphs-in-python-bb6...

Python类型提示工程实践:提升代码质量的静态验证方案

根据GitHub年度开发者调查报告,采用类型提示的Python项目维护成本降低42%,代码审查效率提升35%。本文通过9个生产案例,解析类型系统在工程实践中的应用,覆盖API设计、数据校验、IDE辅助...

Python:深度剖析实例方法、类方法和静态方法的区别

在Python中,类方法(classmethod)、实例方法(instancemethod)和静态方法(staticmethod)是三种不同类型的函数,它们在使用方式和功能上有一些重要的区别。理...

取消回复欢迎 发表评论: