内容详情 您现在的位置是: 首页> 其他随笔

多态于多态性与鸭子类型

发布时间:2022-03-18 18:48 已围观:1004

摘要多态于多态性与鸭子类型

一:多态与多态性

多态:
同一种事物有多种形态
动物有多种形态:如狗、猫、猪

class Animal:    # 同一类事物:动物
  def talk(self):
        pass
    
class Dog(Animal):  # 动物的形态之一:狗
    def talk(self):       
        print("汪汪汪")

class Cat(Animal):  # 动物的形态之二:猫
    def talk(self):
        print('喵喵!')

class Pig(Animal):  # 动物的形态之一:猪
    def talk(self):
        print("哼哼哼!")

实例化得到三个对象

obj1 = Dog()
obj2 = Cat()
obj3 = Pig()

父类的功能是用来统一子类的,定标准的,只要看父类功能就知道子类也有

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

汪汪汪

obj2.talk()

喵喵!

obj3.talk()

哼哼哼!

在多态性背景下用的继承,父类的功能其实不是真的拿来给子类用的,而是用来给子类定标准的,用来统一子类的,只需要把父类的功能规定好了,子类就肯定有,这样的好处是只要看父类就知道子类有什么功能
更进一步,我们可以定义一个统一的接口来使用
def talk(animal):    # 定义一个函数talk 传进来参数就叫动物
animal.talk()    # 只要是动物就肯定有talk方法

三个对象统一用一个函数talk去调,用起来统一了

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

指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化

class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod   # 该装饰器限制子类必须定义有一个名为talk的方法
def talk(self): # 抽象方法中无需实现具体的功能
pass

class Dog(Animal):  # 但凡继承Animal的子类都必须遵循Animal规定的标准
def talk(self):
print("汪汪汪")

class Cat(Animal):
def talk(self):
print('喵喵!')

class Pig(Animal):
def tell(self):  # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化
print("哼哼哼!")

obj1 = Dog()
obj2 = Cat()
obj3 = Pig()

obj1.talk()
obj2.talk()
obj3.talk()

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

三者看起来都像,三者都有talk功能,然而它们并没有直接的关系,且互相独立

class Dog:
def talk(self):
print("汪汪汪")

class Cat:
def talk(self):
print('喵喵!')

class Pig:
def talk(self):
print("哼哼哼!")

声明:本文内容摘自网络,版权归原作者所有。如有侵权,请联系处理,谢谢~
转发:Iron_Man-super--https://www.cnblogs.com/goOJBK/p/16039927.html

赞一个 (66)