一文帶你瞭解python中的多型

m53469發表於2021-09-11

一文帶你瞭解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() 方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2819/viewspace-2834223/,如需轉載,請註明出處,否則將追究法律責任。

相關文章