一 什么是多态
同一类事物具有多种形态
# 猫 狗 都属于动物这一类
class Animal:
pass
class Cat(Animal):
pass
class Dog(Animal):
pass
二 为何要有多态
多态性指的是可以在不考虑对象具体类型的情况下直接使用对象
class Animal:
def talk(self):
print('动物会发出声音...')
class Cat(Animal):
def talk(self):
super().talk()
print('喵喵喵~')
class Dog(Animal):
def talk(self):
super().talk()
print('汪汪汪~')
# 产生对象
cat = Cat()
dog = Dog()
# 调用方法
cat.talk()
dog.talk()
# 可以定义一个接口(功能)接收对象
def talk(animal_obj):
animal_obj.talk()
talk(cat)
总结:多态性的本质在于不同的类中定义有相同的方法名
我们就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名
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 Cpu:
def read(self):
print('cpu read')
def write(self):
print('cpu write')
class Mem:
def read(self):
print('mem read')
def write(self):
print('mem write')
class Txt:
def read(self):
print('txt read')
def write(self):
print('txt write')
obj1=Cpu()
obj2=Mem()
obj3=Txt()
obj1.read()
obj1.write()
obj2.read()
obj2.write()
obj3.read()
obj3.write()