[英]How Python's Super() works in multiple inheritance for superclasses?
我試圖了解 super 如何在 python 的多個 inheritance 中為超類工作,例如在下面的代碼中:
class First():
def __init__(self, parm1, **kwargs):
super().__init__(**kwargs)
self.parm1 = parm1
self.parm3 = 'one'
class Second():
def __init__(self, parm2 = 'zero', **kwargs):
super().__init__(**kwargs)
self.parm2 = parm2
class Third(First,Second):
def __init__(self,parm1):
super().__init__(parm1=parm1)
trd = Third('tst')
print(trd.parm1) # 'tst'
print(trd.parm3) # 'one'
print(trd.parm2) # 'zero'
如果我刪除super().__init__(**kwargs)
執行結束
'第三' object 沒有屬性 'parm2'
僅打印parm1
和parm3
,即使我在Class Third(First,Second)
中聲明了層次結構。
我知道所有類都繼承自 Object class,但我不明白它如何與父類中的 super() class 以及后者如何允許訪問第二個父類的屬性有關。
請參閱https://realpython.com/lessons/multiple-inheritance-python/
基類從左到右應用,即最基的 class 位於右側。
例如,在class Third(First,Second)
中,來自First
的東西將覆蓋來自Second
的東西。 ie Second
是這里最基礎的 class。 (從命名來看,您可能期望相反?)
我們還可以通過檢查Third
的“方法解析順序”來看到這一點:
In [1]: Third.__mro__
Out[1]: (__main__.Third, __main__.First, __main__.Second, object)
我們可以按照從左到右的順序將這個元組讀取為 child->parent。 見https://stackoverflow.com/a/2010732/202168
要知道的另一件事是super().__init__()
會根據上下文找到不同的父 class 來調用。
例如First
不從Second
繼承,因此如果您實例化First
, super
調用將 go 直接到object
。 我們可以在 MRO 中看到這一點:
In [2]: First.__mro__
Out[2]: (__main__.First, object)
但是當我們實例化一個Third
時,class 繼承自First
和Second
...所以super
調用鏈將反映Third.__mro__
中的順序 ...這意味着First
中的super
調用現在將調用Second
中的方法(因為Second
是從發起super
調用鏈的子 class 的角度來看的下一個父 class )。 Second
中的super
調用將調用object
的__init__
,鏈在此結束。
這意味着如果你從First
中刪除super().__init__(**kwargs)
,那么 super 調用鏈在到達Second.__init__
之前就會中斷。
因此,當您嘗試print(trd.parm2)
時,您會得到AttributeError
"'Third' object has no attribute 'parm2'" 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.