我們都知道,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實戰教程下,,一起相互監督共同進步!
本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。

