什么是多態(tài)孤里?
多態(tài)顧名思義多種狀態(tài)牵素,在python中籍凝,不同的對象調用同一個接口,表現出不同的狀態(tài)箍鼓,稱為多態(tài)。
class Duck():
? ? def who(self):
? ? ? ? print("I am a duck")
class Dog():
? ? def who(self):
? ? ? ? print("I am a dog")
class Cat():
? ? def who(self):
? ? ? ? print("I am a cat")
if __name__ == "__main__":
? ? duck=Duck()
? ? dog=Dog()
? ? cat=Cat()
? ? duck.who()
? ? dog.who()
? ? cat.who()
輸出結果:
I am a duck
I am a dog
I am a cat
以上代碼是多態(tài)嗎呵曹?雖然不同的對象調用同一個接口表現出不同狀態(tài)款咖,但是!奄喂!這不是多態(tài)铐殃!要實現多態(tài)有兩個前提:
1.繼承:多態(tài)必須發(fā)生在父類與子類之間
2.重寫:子類重寫父類方法
把以上代碼進行修改,使之繼承父類跨新,才實現多態(tài)富腊,如下:
class Animal():
? ? def who(self):
? ? ? ? print("I am an Animal")
class Duck(Animal):
? ? def who(self):
? ? ? ? print("I am a duck")
class Dog(Animal):
? ? def who(self):
? ? ? ? print("I am a dog")
class Cat(Animal):
? ? def who(self):
? ? ? ? print("I am a cat")
if __name__ == "__main__":
? ? duck=Duck()
? ? dog=Dog()
? ? cat=Cat()
? ? duck.who()
? ? dog.who()
? ? cat.who()
多態(tài)有什么用?
其實以上代碼實際貌似沒啥用玻蝌,為什么一定要去定義通過同一個函數名?我定義who1,who2,who3不可以嗎词疼?代碼量也一樣案┦鳌!
其實真正體驗出多態(tài)好處的代碼一般是這樣寫的
class Animal():
? ? def who(self):
? ? ? ? print("I am an Animal")
class Duck(Animal):
? ? def who(self):
? ? ? ? print("I am a duck")
class Dog(Animal):
? ? def who(self):
? ? ? ? print("I am a dog")
class Cat(Animal):
? ? def who(self):
? ? ? ? print("I am a cat")
def func(obj):
? ? obj.who()
if __name__ == "__main__":
? ? duck=Duck()
? ? dog=Dog()
? ? cat=Cat()
? ? func(duck)
? ? func(dog)
? ? func(cat)
僅僅需要一個函數贰盗,就可以把不同對象的who函數表現出來了许饿。這就增加了程序的靈活性,以不變應萬變舵盈,不管你類中的who()寫得如何得天花亂墜陋率,我都可以用一個統(tǒng)一的形式來調用球化。另外,它增加了程序的可擴展性瓦糟,不管是我們或者調用者筒愚,如果想增加新的功能,都不需要修改原來的代碼菩浙。
例如巢掺,我想新增一個bird類,僅需增加以下代碼劲蜻,無需修改原來的陆淀。
class Bird(Animal):
? ? def who(self):
? ? ? ? print("I am a bird")
對于調用者,也僅需增加以下代碼先嬉,無需修改原來的轧苫。
bird=Bird()
func(bird)
所以說多態(tài)有什么用?一是增加程序的靈活性疫蔓,二是增加程序的可擴展性