多态的概念:同一个方法名,在不同的对象上调用时,能呈现出不同的行为
Python中支持:标准多态、鸭子多态
标准多态
bash
from abc import ABC,abstractmethod
class Animal(ABC):
@abstractmethod
def eat(self):
pass
class Dog(Animal):
def eat(self):
print("狗吃骨头")
class Cat(Animal):
def eat(self):
print("猫吃鱼")
def eat(animal:Animal):
animal.eat()
d1 = Dog()
c1 = Cat()
eat(d1)
eat(c1)

必备条件
- 必须要有继承关系
- 必须要有方法重写
- 父类引用指向子类对象
鸭子多态
核心理念:如果一个东西看起来像鸭子,叫起来也像鸭子,那它就是鸭子
鸭子类型是一种编程风格,它不检查对象的类型,只关注对象能否"做某件事"(是否有对应的方法)
鸭子多态(基于行为):完全不需要继承。函数不检查传入对象的类型,只直接调用它需要的方法。只要传入的对象恰好拥有这个方法(且能正常工作),代码就能跑通;如果没有,运行时会报错。
bash
class Cat:
def eat(self):
print("猫吃鱼")
class Dog:
def eat(self):
print("狗吃骨头")
class Computer:
def eat(self):
print("电脑吃内存")
def eat(animal):
animal.eat()
c1 = Cat()
d1 = Dog()
cm1 = Computer()
eat(c1)
eat(d1)
eat(cm1)
