首頁 >後端開發 >Python教學 >Python 的 super() 函數如何與多重繼承和方法解析順序 (MRO) 搭配使用?

Python 的 super() 函數如何與多重繼承和方法解析順序 (MRO) 搭配使用?

Barbara Streisand
Barbara Streisand原創
2024-12-30 08:26:08450瀏覽

How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn