文章目錄
- 1. 多態
- 1.1 什么是多態
- 1.2 多態實現方式
- 1.3 多態的好處
- 1.4 多態的好處
- 1.5 不同層面的理解
- 1.6 多態的優缺點
1. 多態
在 Python 里,多態是一種非常有用的編程特性,它能讓你以統一的方式處理不同類型的對象
1.1 什么是多態
多態就好比在生活中,不同職業的人面對 “工作” 這件事,會有不同的表現。
比如老師的工作是教書,醫生的工作是治病。雖然大家說的都是 “工作”,但具體的行為卻不一樣。
在編程中,多態允許你使用相同的代碼來處理不同類型的對象,而這些對象會根據自身的類型做出不同的響應。
1.2 多態實現方式
在 Python 里,多態主要通過 繼承 和 方法重寫 來實現。
下面是一個簡單的示例:
# 定義一個父類
class Animal:def speak(self):pass# 定義子類 Dog,繼承自 Animal
class Dog(Animal):def speak(self):return "汪汪汪"# 定義子類 Cat,繼承自 Animal
class Cat(Animal):def speak(self):return "喵喵喵"# 定義一個函數,用于調用動物的 speak 方法
def animal_speak(animal):print(animal.speak())# 創建 Dog 和 Cat 的實例
dog = Dog()
cat = Cat()# 調用 animal_speak 函數,傳入不同的對象
animal_speak(dog)
animal_speak(cat)# 結果
汪汪汪
喵喵喵***Repl Closed***
在這個例子中:
- Animal 是父類,它定義了一個 speak 方法,但這個方法沒有具體的實現。
- Dog 和 Cat 是 Animal 的子類,它們都重寫了 speak 方法,實現了自己獨特的叫聲。
- animal_speak 函數接受一個 Animal 類型的對象作為參數,并調用該對象的 speak 方法。
- 當我們傳入 Dog 或 Cat 的實例時,animal_speak 函數會根據對象的實際類型調用相應的 speak 方法,這就是多態的體現。
1.3 多態的好處
- 代碼復用:通過多態,你可以編寫通用的代碼來處理不同類型的對象,避免了為每種對象類型編寫重復的代碼。
- 可擴展性:當需要添加新的對象類型時,只需創建一個新的子類并實現相應的方法,而不需要修改現有的代碼。
1.4 多態的好處
Python 是一種動態類型語言,這意味著在運行時才確定變量的類型。這種特性使得多態在 Python 中更加靈活。只要對象具有所需的方法,就可以將其傳遞給相應的函數,而不需要考慮對象的具體類型。
1.5 不同層面的理解
- 鴨子類型(Duck Typing)
在 Python 中,多態常常通過鴨子類型來體現。
鴨子類型的核心思想是:“如果它走路像鴨子,叫聲像鴨子,那么它就是鴨子”。也就是說,在代碼中不關注對象的具體類型,只關注對象是否具有特定的方法和屬性。
class Bird:def fly(self):print("鳥在飛")class Airplane:def fly(self):print("飛機在飛")def make_fly(obj):obj.fly()bird = Bird()
airplane = Airplane()make_fly(bird)
make_fly(airplane)
在這個例子中,make_fly 函數不關心傳入的對象是 Bird 類還是 Airplane 類的實例,只要對象有 fly 方法,就可以調用該方法,這就是鴨子類型實現的多態。
- 多態與其他特性的關聯
多態與繼承:
繼承是實現多態的重要手段之一。通過繼承,子類可以重寫父類的方法,從而在調用相同方法時表現出不同的行為。前面已經有很多通過繼承實現多態的例子,比如動物叫聲、圖形繪制等。
多態與封裝:
封裝是將數據和操作數據的方法捆綁在一起,隱藏對象的內部實現細節。多態可以基于封裝來實現,不同的類通過封裝各自的方法,在外部調用時以統一的方式呈現不同的行為。例如在游戲開發中,每個角色類封裝了自己的攻擊方法,外部通過統一的接口調用攻擊方法,體現了多態。
1.6 多態的優缺點
- 優點
-
代碼復用和可維護性:可以編寫通用的代碼來處理不同類型的對象,減少代碼重復,提高代碼的可維護性。當需要添加新的對象類型時,只需要實現相應的方法,而不需要修改現有的代碼。
-
擴展性:易于擴展系統功能。例如在圖形繪制系統中,添加新的圖形類型時,只需要創建新的子類并實現繪制方法,就可以無縫集成到現有的系統中。
- 缺點
-
理解難度:對于初學者來說,多態尤其是涉及到復雜的繼承和多繼承時,可能會增加理解的難度。需要對類的層次結構和方法調用順序有清晰的認識。
-
性能開銷:在某些情況下,多態可能會帶來一定的性能開銷,特別是在使用抽象基類和復雜的方法查找時。不過在大多數實際應用中,這種開銷通常是可以接受的。