多态性与鸭子类型(多态性包罗哪两种)

admin|
103


强烈保举配套材料:egon新书来袭干货满满 - linhaifeng

多态与多态性

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

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): # 笼统办法中无需实现详细的功用        pass        class Cat(Animal): # 凡是继承Animal的子类都必需遵照Animal规定的尺度        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    Egon保举全套自学精品视频

python全栈高级项目开发精品课程如下,适用于零根底小白自学入行python开发、在职工程师高级提拔