舊式類別和新式類別之間的方法解析順序(MRO) 差異
Python 中的新式類別在與遺留類別相比的方法解析順序(MRO)。雖然提供的範例正確演示了新型類別的 MRO 解析,但讓我們深入研究區分這兩種方法的細微差別。
當祖先類別在「樸素」深度中多次出現時,關鍵區別就會出現 -第一個決議順序。考慮以下「鑽石繼承」情況:
class A: x = 'a' class B(A): pass class C(A): x = 'c' class D(B, C): pass
使用遺留類,解析順序為:D - B - A - C - A。依照此順序,首先遇到 A,從而導致'x' 的定義被 C 中的後續定義隱藏。
D.x => 'a'
但是,新式類別採用修訂後的 MRO:
D.__mro__ = (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
此順序確保祖先類別出現僅一次且畢竟是它們的子類別。因此,像 C 對 'x' 的修改這樣的覆蓋優先。
D.x => 'c'
透過避免在解析順序中多次出現祖先類,這種方法消除了歧義並確保了複雜繼承層次結構中的直觀行為。這就是為什麼通常應該避免使用舊式類別而選擇新式類,特別是在處理多重繼承和類菱形模式時。
以上是Python 中傳統類別和新式類別的方法解析順序 (MRO) 有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!