簡介
多重繼承在決定哪個父級時提出哪個父級時提出了獨特的挑戰使用super() 函數呼叫的方法。本文探討了 super() 在此類場景中的行為,並著重於其與方法解析順序 (MRO) 的交互作用。
Super() 和父方法呼叫
當使用多重繼承的 super() 時,它引用 MRO 中第一個父類別的方法。例如,在下面的程式碼片段中:
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")
Third 的 MRO 是 [Third, First, Second, object]。因此,Third 中的 super().__init__() 引用 First.__init__。
方法解析順序 (MRO)
MRO 決定 Python 搜尋的順序用於從父類繼承的方法和屬性。一般來說,MRO 首先列出子類,然後是其父類,因為它們在類別定義中列出。
在上面的範例中,MRO 是 [Third, First, Second, object]。此順序用於解析方法呼叫和屬性查找,從 Third 開始,沿著父類樹向下移動。
自訂和歧義
而 Python 通常會建構MRO 會自動執行,可以使用 mro 屬性來自訂。然而,確保 MRO 明確非常重要。如果不是,Python 將引發異常。
考慮以下不清楚的 MRO:
class First(object): def __init__(self): print("first") class Second(First): def __init__(self): print("second") class Third(First, Second): def __init__(self): print("third")
Third 的 MRO 應該是 [First, Second] 還是 [Second, First]?沒有明確的期望,因此Python 引發錯誤:
TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases Second, First
理解MRO
要完全理解super() 如何與多重繼承交互,至關重要掌握MRO的概念。透過了解 MRO 的建構和解析規則,開發人員可以有效地使用 super() 並避免多重繼承場景中潛在的衝突。
以上是Python 的 super() 函數如何處理多重繼承中的方法解析順序 (MRO)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!