python中的多態是如何運用的?案例詳解


我們都知道,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實戰教程下,,一起相互監督共同進步!

本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM