美文网首页
04 多态性与鸭子类型

04 多态性与鸭子类型

作者: 阿登20 | 来源:发表于2020-12-01 22:30 被阅读0次

多态与多态性

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

 一类事物有多种形态,比如动物有多种形态:猫、狗、猪
 多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象
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动物对象"""
    animal.talk()

print("=".center(50, "="))
# 把对象 传递给一个函数,那么这个函数就拥有对象的操作方法
Talk(cat)
Talk(dog)
Talk(pig)
==================================================
喵喵喵
汪汪汪
哼哼哼

多态性的好处在于增强了程序的灵活性和可扩展性,比如通过继承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):# 父类统一标准的功能,Animal类不是用来实例化的
    @abc.abstractmethod # 该装饰器限制,子类必须定义有一个名为talk的方法
    def talk(self): # 抽象方法中无需实现具体的功能
        pass

class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准:必须还有talk方法
    def talk(self):
        pass

cat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

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

二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系

class Txt: #Txt类有两个与文件类型同名的方法,即read和write
    def read(self):
        pass
    def write(self):
        pass

class Disk: #Disk类也有两个与文件类型同名的方法:read和write
    def read(self):
        pass
    def write(self):
        pass

相关文章

  • 04 多态性与鸭子类型

    多态与多态性 多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪 多态性指的是可以在不用考虑对象具体类型...

  • 多态性与鸭子类型

    一,多态性 多态示例 二,鸭子类型 1,定义 2,示例

  • python入门学习笔记之多态与多态性

    本节重点 多态与多态性鸭子类型本节时长需控制在15分钟内 多态 多态指的是一类事物有多种形态,比如 动物有多种形态...

  • 语法

    鸭子类型 动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If ...

  • 第四章 深入类和对象

    一. 鸭子类型和多态 鸭子类型与多态文章详解 如果一个对象实现了__getitem__方法,那python的解释器...

  • 读书笔记|《故事》罗伯特·麦基5

    PART Ⅱ | 故事诸要素 CHAPTER 04| 结构与类型 电影类型/结构与类型的关系/精通类型/创作限制/...

  • python入门系列:深入类和对象

    鸭子类型和多态 引言 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。 例如,在不使用鸭子类型的语言中...

  • python鸭子类型

    抽象类,多态与鸭子类型 - 独角兕大王 - 博客园

  • 2017.9.20

    多态 多态性的概念 多态性是面向对象程序设计的第三个重要特征。 多态性是指发出同样的消息被不同类型的对象接收时导致...

  • 2017-9-20学习总结

    笔记内容: 多态性的概念 多态性是面向对象程序设计的第三个重要特征。 多态性是指发出同样的消息被不同类型的对象接收...

网友评论

      本文标题:04 多态性与鸭子类型

      本文链接:https://www.haomeiwen.com/subject/tjpewktx.html