一、多态与多态性

多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪

class Animal: # 同一类事物:动物def talk(self):pass
class Cat(Animal): # 动物的形态之一:猫def talk(self): print('喵喵喵')
class Dog(Animal): # 动物的形态之二:狗def talk(self):print('汪汪汪')
class Pig(Animal): # 动物的形态之三:猪def talk(self):print('哼哼哼')# 实例化得到三个对象
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()

多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法统一成一种:例如cat、dog、pig都是动物,但凡是动物肯定有talk方法,于是我们可以不用考虑它们三者的具体是什么类型的动物,而直接使用

>>> cat.talk()
喵喵喵
>>> dog.talk()
汪汪汪
>>> pig.talk()
哼哼哼

更进一步,可以定义一个统一的接口来使用

>>> def Talk(animal):
...     animal.talk()
...
>>> Talk(cat)
喵喵喵
>>> Talk(dog)
汪汪汪
>>> Talk(pig)
哼哼哼

Python中一切皆对象,本身就支持多态性

# 我们可以在不考虑三者类型的情况下直接使用统计三个对象的长度
s.__len__()
l.__len__()
t.__len__()# Python内置了一个统一的接口
len(s)
len(l)
len(t)

多态性的好处在于增强了程序的灵活性和可扩展性,比如通过继承Animal类创建了一个新的类,实例化得到的对象obj,可以使用相同的方式使用obj.talk()

>>> class Wolf(Animal): #动物的另外一种形态:狼
...     def talk(self):
...         print('嗷...')
...
>>> wolf=Wolf() # 实例出一头狼
>>> wolf.talk() # 使用者根本无需关心wolf是什么类型而调用talk
嗷...

综上得知,多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名

import abc# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):@abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法def talk(self): # 抽象方法中无需实现具体的功能passclass Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准def talk(self):passcat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

Python术语表中的鸭子类型 duck-typing :

鸭子类型是一种编程风格,决定一个对象是否有正确的接口,关注点在于它的方法或属性,而不是它的类型(“如果它看起来像鸭子,像鸭子一样嘎嘎叫,那么它一定是鸭子。”)。通过强调接口而不是特定类型,设计良好的代码通过多态提高了灵活性。鸭子类型无需使用 type() 或 isinstance() 进行检查(注意,鸭子类型可以用抽象基类来补充),相反,它通常使用 hasattr() 来检查,或是 EAFP 编程。

但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度,如下

# 二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Txt: # Txt类有两个与文件类型同名的方法,即read和writedef read(self):passdef write(self):passclass Disk: # Disk类也有两个与文件类型同名的方法:read和writedef read(self):passdef write(self):pass

Python之多态与鸭子类型相关推荐

  1. Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)

    1.创建类的代码: #在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入objectclass Animal(object):#在python中init方 ...

  2. Python 语言中的 “鸭子类型”

    Python 语言中的 "鸭子类型" 继承 多态 鸭子类型 不要检查它是不是鸭子.它的叫声像不像鸭子.它的走路姿势像不像鸭子,等等.具体检查什么取决于你想使用语言的哪些行为.(co ...

  3. Py测开《多态和鸭子类型的区别》

    目录 一.面向对象编程的三大特征 二.什么是多态 三.实现多态的步骤 1.Python中函数的参数是没有类型限制的 2.子类的对象是不是属于这个父类 3.实现伪多态 四.多态的意义 五.鸭子类型 1. ...

  4. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

  5. python多态和鸭子类型

    概述 python是一门解释语言,但是同java等静态语言一样,是可以通过继承的方式实现多态.而且python还有一个自己的特殊实现多态的方法,就是通过鸭子类型,来实现多态. 继承多态 通过严格的继承 ...

  6. Python多态与鸭子类型

    学习到多态的时候,不确定自己是否完全理解了python的多态,于是Google观看了众多资料和文献,发现很多编程大佬讲得过于抽象,不便于新手理解,这违背了python的初衷:简单. 所以我在此用通俗一 ...

  7. python 接口(抽象) 多态,鸭子类型, 多继承原理(mro)

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  8. python 多态 协议 鸭子类型

    接口(python 中的协议)的多种不同的实现方式即为多态.多态的作用,就是为了类在继承和派生的时候,保证使用"家谱"中任一类的实例的某一属性时的正确调用. from abc im ...

  9. 面向对象—多态、鸭子类型(Day21)

    编程原则java具有自己的编程原则和设计模式,不能多继承.python的编程原则:1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的).2.依赖倒置原则:高层 ...

最新文章

  1. groupadd - 建 立 新 群 组
  2. leetcode算法题--买卖股票的最佳时机 II
  3. 结合MongoDB开发LBS应用
  4. python函数拟合不规则曲线_python曲线拟合
  5. 【LeetCode笔记】22.括号生成(Java、DFS回溯、剪枝、括号)
  6. 一款脑洞大开的表格可视化神器
  7. RADIUS实验(802.1x)
  8. 手把手教你软件著作权申请(全流程)(不花一分冤枉钱)
  9. 完整图书馆管理系统(包含设计思路、图形界面、后台数据库)
  10. java blowfish 算法_Java Blowfish对称密钥加密算法的实现和加密案例
  11. Bayesian Browsing Model 的个人理解
  12. flex java oracle_flex+eclipse+tomcat+lcds+jdk+oracle安装步骤和配置
  13. 差分放大电路知识总结
  14. LDIFDE试验全记录
  15. Nmap常用命令总结
  16. [附源码]计算机毕业设计Python的连锁药店销售管理系统(程序+源码+LW文档)
  17. 让你在ManjaroLinux下也能只用你喜欢的中文输入法
  18. 人工智能教程 - 前言
  19. 告别盗版杀软!免费用17款鼎鼎大名的杀毒软件
  20. 震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒

热门文章

  1. 埙曲推荐,《天空之城》简谱
  2. TG申请取消禁言教程
  3. chatgpt3.5生成的关于电磁阀的论文
  4. C语言数据结构上机题:高铁网络
  5. 国内知名机器人公司盘点
  6. 恩施软件开发人员每月多少钱_2020年全球软件开发人员薪资调查结果出炉!
  7. 创业公司股权结构设计(案例)
  8. 运动控制中的安全机制——限位
  9. 39度发烧堂:常用音频格式有什么区别?
  10. 有关WINDOWS XP登录密码的几种方法