Python 多重繼承中的 Super()
Python 中的多重繼承帶來了 super() 如何與其互動的問題。考慮下面的程式碼:
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
現在, super().__init__ 引用了 Third 的哪個父方法?你能選擇運行哪一個嗎?
為了在這種情況下理解 super(),我們深入研究方法解析順序 (MRO) 的概念。在 Python 中,MRO 定義了涉及多重繼承時解析方法的順序。
在我們的範例中,Third() 將會呼叫 First.__init__。 Python 從左到右檢查類別父類別中的每個屬性。對於 __init__,Python 首先在 First 中查找,如果在那裡沒有找到,則在 Second 中檢查。
隨著繼承的交織,情況變得更加複雜。請閱讀 Guido 關於 MRO 的部落格文章以了解更多相關資訊。然而,Python 通常會保持所寫的繼承順序,從子類別本身開始。
考慮以下範例:
class First(object): def __init__(self): print("first") class Second(First): def __init__(self): print("second") class Third(First): def __init__(self): print("third") class Fourth(Second, Third): def __init__(self): super(Fourth, self).__init__() print("that's it")
這裡,MRO 將是 [第四,第二,第三,第一]。
需要注意的是,如果Python無法確定一致的MRO,它會引發異常,而不是訴諸潛在的意外
此外,值得一提的是,提供的示例不使用super() 調用。它們的目的是演示 MRO 的建造方式,而不是列印特定的輸出。我們鼓勵您嘗試 super() 調用,以更深入地了解 Python 的繼承模型。
以上是Python多重繼承中`super()`如何解決方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!