多态指的是同一类事物有多种不一样的形态python
多态也称为多态性,目的是为了 在不知道对象具体类型的状况下,统一对象的调用方法的规范函数
耦合度高,程序可扩展性低code
父类:定制一套统一的规范(好比方法名统一)对象
子类:遵循父类的统一规范(好比子类要遵循父类方法名统一)继承
注意:在python中不会强制限制子类必需要遵循父类的规范,因此出现了抽象类it
class Animal: def speak(self): pass def eat(self): pass class Dog(Animal): def speak(self): # 遵循父类的speak print('汪汪汪~') def eat(self): # 遵循父类的eat print('舔狗~') class Pig(Animal): def speak(self): # 遵循父类的speak print('哼哼哼~') def eat(self): # 遵循父类的eat print('嗯嗯嗯~') # 统一了对象的调用方式 dog_obj = Dog() pig_obj = Pig() dog_obj.speak() pig_obj.speak() dog_obj.eat() pig_obj.eat()
在python内置的abc模块中有一个抽象类class
让子类必须遵循父类的编写规范import
父类须要继承abc抽象类,metaclass=abc.ABCMeta扩展
在父类的方法中须要装饰上,abc.abstractmethodmeta
注意:python中不推荐使用抽象类,由于耦合度极高,可扩展性极低
子类必须按照父类的方法编写规范,缺一不可,只要父类中有多少个,子类中都要定义上
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def speak(self): pass @abc.abstractmethod def eat(self): pass class Dog(Animal): def speak(self): # 遵循父类的speak print('汪汪汪~') def eat(self): # 遵循父类的eat print('舔狗~') class Pig(Animal): def speak(self): # 遵循父类的speak print('哼哼哼~') def chi(self): # 未遵循父类的eat,则会报错TypeError: Can't instantiate abstract class Pig with abstract methods eat print('嗯嗯嗯~') class Cat(Animal): def speak(self): print('喵喵喵~') # 缺乏一个父类定义的规范会报错 # TypeError: Can't instantiate abstract class Cat with abstract methods eat dog_obj = Dog() # pig_obj = Pig() dog_obj.speak() # pig_obj.speak() dog_obj.eat() # pig_obj.chi() cat_obj = Cat()
不一样的对象,只要长得像鸭子,那它就是鸭子
耦合度低,程序可扩展性强
不一样的对象,先抽象出相同类型的方法,给他们定制一套统一 规范,全部的类,在定义时都按照统一的规范进行编写
注意:在python中推荐使用鸭子类型
# 抽象统必定制出一套规范,speak,eat # 猪类 class Pig: def eat(self): print('bia唧...') def speak(self): print('哼哼哼...') # 猫类 class Cat: def eat(self): print('咬ji 咬ji....') def speak(self): print('喵喵喵...') # 狗类 class Dog: def eat(self): print('舔狗...') def speak(self): print('汪汪汪...') # 由于都有speak和eat 因此能够定义一个speak和eat函数能够直接调用 dog = Dog() pig = Pig() def SPEAK(animal): animal.speak() def EAT(animal): animal.eat() SPEAK(pig) EAT(dog)