多態指的是同一類事物有多種不一樣的形態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)