我們都知道,Python 是弱類型語言,其最明顯的特征是在使用變量時,無需為其指定具體的數據類型。這會導致一種情況,即同一變量
可能會被先后賦值不同的類對象,例如:
class CLanguage: def say(self): print("賦值的是 CLanguage 類的實例對象") class CPython: def say(self): print("賦值的是 CPython 類的實例對象") a = CLanguage() a.say() a = CPython() a.say()
運行結果為:
賦值的是 CLanguage 類的實例對象 賦值的是 CPython 類的實例對象
可以看到,a 可以被先后賦值為 CLanguage 類和 CPython 類的對象,但這並不是多態。類的多態特性,還要滿足以下 2 個前提條件:繼承:多態一定是發生在子類和父類之間;重寫:子類重寫了父類的方法。
下面程序是對上面代碼的改寫:
class CLanguage: def say(self): print("調用的是 Clanguage 類的say方法") class CPython(CLanguage): def say(self): print("調用的是 CPython 類的say方法") class CLinux(CLanguage): def say(self): print("調用的是 CLinux 類的say方法") a = CLanguage() a.say() a = CPython() a.say() a = CLinux() a.say()
執行結果
調用的是 Clanguage 類的say方法 調用的是 CPython 類的say方法 調用的是 CLinux 類的say方法
可以看到,CPython 和 CLinux 都繼承自 CLanguage 類,且各自都重寫了父類的 say() 方法。從運行結果可以看出,同一變量 a 在執行同一個 say() 方法時,由於 a 實際表示不同的類實例對象,因此 a.say() 調用的並不是同一個類中的 say() 方法,這就是多態。
但是,僅僅學到這里,讀者還無法領略 Python 類使用多態特性的精髓。其實,Python 在多態的基礎上,衍生出了一種更靈活的編程機制。
繼續對上面的程序進行改寫:
class WhoSay: def say(self,who): who.say() class CLanguage: def say(self): print("調用的是 Clanguage 類的say方法") class CPython(CLanguage): def say(self): print("調用的是 CPython 類的say方法") class CLinux(CLanguage): def say(self): print("調用的是 CLinux 類的say方法") a = WhoSay() #調用 CLanguage 類的 say() 方法 a.say(CLanguage()) #調用 CPython 類的 say() 方法 a.say(CPython()) #調用 CLinux 類的 say() 方法 a.say(CLinux())
程序執行結果為:
調用的是 Clanguage 類的say方法 調用的是 CPython 類的say方法 調用的是 CLinux 類的say方法
此程序中,通過給 WhoSay 類中的 say() 函數添加一個 who 參數,其內部利用傳入的 who 調用 say() 方法。這意味着,當調用
WhoSay 類中的 say() 方法時,我們傳給 who 參數的是哪個類的實例對象,它就會調用那個類中的 say() 方法。
最后注意:很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。為此小編建了個Python全棧免費答疑.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python實戰教程下,,一起相互監督共同進步!
本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。