Python 的super() 和多重繼承
在Python 中,多重繼承在確定哪個父方法時會帶來複雜性。 super() 函數在此場景中起著至關重要的作用,但其行為取決於方法解析順序 (MRO)。
MRO 和 super()
MRO 定義了在父類中搜尋屬性的順序。在您的範例中:
class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it"
super(Third, self).__init__() 呼叫 MRO 中第一個類別的 __init__() 方法。在本例中,它是 First。
選擇父方法
您無法使用 super() 明確選擇要呼叫的父方法。 MRO 規定搜尋順序,而 super() 總是引用該順序中的第一個類別。
範例(單路徑繼承)
在您的範例中沒有交叉繼承,MRO 很簡單:[第三,第一,第二,物件]。因此, super(Third, self).__init__() 將始終呼叫 First.__init__()。
範例(交叉繼承)
考慮以下程式碼:
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 現在是[第四,第二,第三,第一, 目的]。 super(Fourth, self).__init__() 將會呼叫 Second.__init__(),MRO 中的第一個類別。
不清楚的MRO
如果繼承路徑交叉(例如,First繼承自Second),Python無法建立連貫的MRO,從而導致例外:
TypeError: Cannot create a consistent method resolution order (MRO) for bases Second, First
結論
super() 是處理多重繼承的強大工具。然而,理解 MRO 對於預測其行為至關重要,因為它決定了使用 super().__init__().
時將呼叫哪個父方法以上是Python 的 super() 函數如何與多重繼承和方法解析順序 (MRO) 搭配使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!