首頁  >  文章  >  後端開發  >  Python 的方法解析順序 (MRO) 如何確保新型類別中明確的方法繼承?

Python 的方法解析順序 (MRO) 如何確保新型類別中明確的方法繼承?

Barbara Streisand
Barbara Streisand原創
2024-10-31 21:07:01341瀏覽

How does Python's Method Resolution Order (MRO) ensure unambiguous method inheritance in new-style classes?

新型類別中的方法解析順序(MRO)

在Python基於類別的程式設計中,方法解析順序(MRO) ) 定義對類別的實例執行方法查找的順序。舊式類別和新式類別的 MRO 實作有所不同。

舊式類別繼承

在舊式類別中,MRO 遵循深度-第一種方法。當在子類別的實例中搜尋方法時,解釋器會以深度優先的方式遍歷子類別的繼承層次結構。傳回該方法在基底類別中第一次出現的位置。

新式類別繼承

隨著新式類別的引入,MRO 語意改為 C3線性化。這種方法消除了繼承層次結構中同一基底類別多次出現而產生的歧義。新式類別的 MRO 計算如下:


  1. 葉類(沒有子類的子類)放置在 MRO 中。

  2. 所有基底類別都在其子類別之前加入 MRO。

  3. 對於 MRO 中的每個基類,為其子類遞歸地重複步驟 1-3。
  4. 對於 MRO 中的每個基類,為其子類遞歸地重複步驟 1-3。 /li>
  5. 如果基類在層次結構中多次出現,則它僅在 MRO 中包含一次。

多重繼承範例

考慮以下新式類別中涉及多重繼承的範例:
<code class="python">class Base1(object):
    def amethod(self):
        print("Base1")

class Base2(Base1):
    pass

class Base3(object):
    def amethod(self):
        print("Base3")

class Derived(Base2, Base3):
    pass

instance = Derived()  
instance.amethod()  
print(Derived.__mro__) </code>

在此範例中,即使Base1 在繼承中出現多次層次結構中,Derived 的MRO 為:
(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)

此順序對應於上述C3 線性化演算法。由於 Derived 是葉類,因此它被放置在 MRO 的第一位。然後,依序加入其基底類別:Base2(Base1 的子類別)和 Base3。最後,將 object 新增為最終基底類別。

結論

新型類別的 MRO 為解決方法繼承提供了確定性且明確的方法。它消除了由於同一基類多次出現而可能產生的潛在歧義,就像舊式類別繼承的情況一樣。

以上是Python 的方法解析順序 (MRO) 如何確保新型類別中明確的方法繼承?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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