簡體   English   中英

Python 的 Super() 如何在多個 inheritance 中為超類工作?

[英]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'

僅打印parm1parm3 ,即使我在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繼承,因此如果您實例化Firstsuper調用將 go 直接到object 我們可以在 MRO 中看到這一點:

In [2]: First.__mro__
Out[2]: (__main__.First, object)

但是當我們實例化一個Third時,class 繼承自FirstSecond ...所以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.

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