新型類別中的MRO(方法解析順序)
在Python 中,方法解析順序(MRO) 決定方法的解析方式如果是繼承的話。在新式類別中,MRO 遵循特定規則,如 Python in a Nutshell(第二版)文件中所述。
在給定的範例中,程式碼使用新式類別語法,但 MRO其行為就好像它是一個舊式類別。新式類別的預期 MRO 應該將 Base3 放在 Base1 之前,以修正這種差異。
舊式類別和新式類別中 MRO 的主要區別在於,當相同祖先時,它們如何處理多重繼承類別出現多次。在舊式類別中,深度優先方法可能會導致方法解析不正確。然而,在新式類別中,書中提到的菱形繼承模式被正確處理。
例如,考慮以下菱形繼承層次結構:
<code class="python">class A(object): x = 'a' class B(A): pass class C(A): x = 'c' class D(B, C): pass</code>
在舊式類別中,MRO 將為D - B - A - C - A,導致D 中x 的值為“ a」。然而,在新式類別中,MRO 是 D - B - C - A - 對象,將 C 放在 A 之前,並允許覆蓋 C 中的 x 生效。這解決了菱形繼承問題。
因此,給定範例的正確 MRO 是 Derived - Base2 - Base1 - Base3 - object,但由於不明確的 MRO 行為,當前程式碼會產生不正確的結果。為了修正這個問題,應該更新類別語法以明確指定類別繼承自 object 以呼叫預期的 MRO 語義。
以上是為什麼我的新型 Python 類別中的 MRO 沒有如預期運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!