# --> ''' 多态 与 鸭子类型 --> 什么是多态 对象的多种状态,父类对象的多种 (子类对象) 状态 --> 什么是鸭子类型: 长的像就是 1.规定有什么属性及什么方法的对象叫鸭子类型 2.能提供出规定的属性与方法的对象就是鸭子 函数内有.xxx .yyy方法 传入的对象也必须要有.xxx .yyy才能运行 ''' # -- ( 多态 ) ------------------------------------------------------------------------------------------- import abc class People(metaclass=abc.ABCMeta): def __init__(self,name): self.name = name def eat(self): print('eat') @abc.abstractmethod def speak(self):pass class Chinese(People): def speak(self): print('说中国话') class England(People): def speak(self): print('说英国话') if __name__ == '__main__': # def ask_someone(obj): # 多态的体现:功能或是需求,需要父类的对象,可以传入父类对象或任意子类对象 # 一般都是规定需要父类对象,传入子类对象 # 有抽象方法的父类不能被实例化 (假设因为被实例化后,就可以调用自己的抽象方法,没有意义) def ask_someone(obj): print('让%s上台演讲'%obj.name) # 父类提供,子类之间继承 obj.speak() # 父类提供,英国和中国speak内容不同, # 调用abc模块装饰父类@abc.abstractmethod子类重写 ch = Chinese('王大锤') # ch实例化,用了Chinses类,用继承的父类People中的自定义name,传入'王大锤' en = England('Tom') ask_someone(ch) # 调用函数ask_someone(obj) 传入ch的实例化 Chinese('王大锤') ask_someone(en) # England 类有.name .speak # ask_someone 方法有.name .speak需求 # 即可直接传入 # -- ( 鸭子类型 ) ------------------------------------------------------------------------------------------- # 长的差不多的类,都具有一样的功能