澄清新型類別中的MRO
與舊的不同樣式類別、新樣式類別內省其基底類別以建立方法解析順序(MRO)。此順序決定了在物件上呼叫方法時搜尋方法的順序。
解決與MRO 的繼承衝突
new- 中MRO 之間的關鍵區別當同一個祖先類別在繼承層次結構中多次出現時,就會出現樣式類別和舊樣式類別。例如,考慮以下菱形繼承情況:
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
Legacy-Style MRO:
在遺留樣式類別中,解析順序為 D - B - A - C - A。這裡,當呼叫 D 時.amethod(),首先找到A中的定義並覆寫C中的定義。
New-Style MRO:
對於新式類,MRO如下:
D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)
請注意,A 以此順序只出現一次,位於其所有子類別之後。這確保了子類別中的重寫(例如C對方法的重寫)優先。
理解MRO的重要性
新式類別中的MRO解決了繼承衝突明智地,允許覆蓋正常運行。它還避免了同一方法的多個定義出現在解析順序中的情況,從而導致不明確的行為。透過有效地理解和利用 MRO,開發人員可以在 Python 中設計健全且可維護的繼承層次結構。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3