簡體   English   中英

在Python中具有多重繼承的MRO

[英]MRO with multiple inheritance in python

Python網頁上的文檔中, python中經典類的方法解析順序被描述為深度優先從左到右的搜索。 我試着用這段代碼測試一下:

class A(object):
def __init__(self):
    print "Initialized A"

class B(A):
    def test():
        print "Initialized B"

class C(A):
    def __init__(self):
        print "Initialized C"

class D(B, C):
    def __init__(self):
        super(D, self).__init__()
        print "Initialized D"

當我創建對象D的實例時:

D()

我得到了結果:

Initialized C
Initialized D

雖然我期望打印“初始化A”,“初始化D”,因為MRO是深度優先的,首先在B中搜索初始化,但是當找不到時(這是這種情況)它應該在層次結構中更深入並尋找函數在B的基類(即A)中。 有人可以給我一個解釋,為什么我得到C的init函數而不是A的那個?

D的MRO是:

print(D.mro())
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]

所以

super(D, self).__init__()

D之后的self.__class__.mro()中的第一個類中查找__init__方法。 由於B沒有__init__ ,因此它在C查找__init__方法。 它找到C.__init__ ,因此

super(D, self).__init__()

調用C.__init__(self)

請注意, super不會嘗試訪問getattr(B, __init__) 相反,它正在B.__dict__尋找'__init__'

您的類繼承自object ,因此不是經典類。 這是一個新式的課程。 (任何繼承自新式類的類也是新式類。)

請注意, super無論如何都不能與經典類一起使用。 您引用的“從左到右的深度”規則只是在您嘗試訪問未在實例上直接定義的屬性時搜索訂單基類的屬性查找規則。 經典類不提供MRO本身 - 沒有任何方法可以訪問屬性的“超類值”而無需顯式引用特定的超類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM