多態(tài)是面向對象的又一重要概念,字面意義就是“多種狀態(tài)”。在程序中不需要區(qū)分引用對象,用相同的調用方法,完成引用對象的功能而表現(xiàn)出多種狀態(tài)。有了多態(tài),就不需要為每個具體的子類編寫功能調用,是一種泛型編程。如果你是一個公司的后勤經(jīng)理,需要打掃地面,不論是掃地機器人還是清潔工,你只要告訴他打掃的范圍,他們就可以完成打掃的任務。
在一些語言中需要使用繼承、接口、不同參數(shù)方法來實現(xiàn)多態(tài)。由于Python是動態(tài)語言,其實現(xiàn)的基本方式稱為“鴨子類型”(duck typing)。即"當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。"在Python的調用語義中,只要調用對象具有所調用的屬性,那么不管調用對象是什么類型,就可以調用成功。
在維基百科的詞條(https://en.wikipedia.org/wiki/Duck_typing)中示例代碼如下:
class Duck:
def fly(self):
print("Duck flying")
class Airplane:
def fly(self):
print("Airplane flying")
class Whale:
def swim(self):
print("Whale swimming")
def lift_off(entity):
entity.fly()
duck = Duck()
airplane = Airplane()
whale = Whale()
lift_off(duck) # prints `Duck flying`
lift_off(airplane) # prints `Airplane flying`
lift_off(whale) # Throws the error `'Whale' object has no attribute 'fly'`
在函數(shù)lift_off()中對傳入的entity調用了fly()方法,傳入函數(shù)的是什么對象類型,只要entity引用的對象包括fly()方法,就可以成功調用,如lift_off(duck)、lift_off(airplane)。而第三次調用時,即lift_off(whale),傳入的是Whale類的實例,其不具有fly()屬性,因此調用就會失敗。
正是因為Python的這種特性,降低了Python實現(xiàn)多態(tài)的難度,提高了多態(tài)實現(xiàn)的靈活性。所以在一些Python的面向對象程序資料中,對多態(tài)的介紹僅限于此。