python3中新類如何繼承?

germo發表於2021-09-11

python中分為舊類和新類,因為小編使用的是主流的python3版本,所以我們本篇文章講的是新類。那麼在新類的繼承中,我們需要注意哪些事項呢?因為有不少小夥伴有這種疑問,所以小編趕緊蒐集了新類方面的資料,大家一起來學習一個示例,我們把這個問題一起解決出來。


首先說明一個問題,Python的多重繼承確實正如文件所言是深度優先從左至右不重複,唯一的問題是,關於優先其實是指最貼近繼承樹葉部的,左側的優先,會最後繼承,從而覆蓋其它繼承得來的效果。在Python裡,當新構造一個物件時,有兩個步驟:首先是自底向上,從左至右呼叫__new__,然後再依照遞迴棧依次呼叫__init__。這個問題可以用以下程式碼說明。

class A:
    def __new__(cls, *argv, **kwargs):
        print('nA')
        return super().__new__(cls)
 
    def __init__(self, a):
        print('A')
        self.a = a
 
    def comeon(self):
        print('A.comeon')
 
 
class B(A):
    def __new__(cls, *argv, **kwargs):
        print('nB')
        return super().__new__(cls)
 
    def __init__(self, b):
        super().__init__(b)
        print('B')
        self.b = b
 
    def comeon(self):
        print('B.comeon')
 
 
class C(A):
    def __new__(cls, *argv, **kwargs):
        print('nC')
        return super().__new__(cls)
 
    def __init__(self, c):
        super().__init__(c)
        print('C')
        self.c = c
 
    def comeon(self):
        print('C.comeon')
 
 
class D(B, C):
    def __new__(cls, *argv, **kwargs):
        print('nD')
        return super().__new__(cls)
 
    def __init__(self, d):
        super().__init__(d)
        print('D')
        self.d = d
 
 
d = D('d')
d.comeon()


首先看到:d.comeon是從左自右得來的左邊的那個B的comeon。那麼如何實現這樣的效果呢?很簡單,讓B的init最後一個執行,就能覆蓋掉C和D寫入的comeon。

所以實際呼叫new的順序就是D--B--C--A,之後遞迴棧回過頭來初始化,呼叫init的順序就是A--C--B--D,只有這樣才能保證B裡的comeon能夠覆蓋掉D的init帶入的comeon和C帶入的comeon,同樣保證如果你的D裡有個comeon,它是最後一個init的,將最後寫入而覆蓋掉其它的。

相信小夥伴們已經學會python3新類的繼承方法了,其中容易出錯的地方,小編也有提到,大家仔細看一下避免出現同樣的失誤。

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

相關文章