[英]Trying to understand Python MRO, but confused with its resolution order
所以我試圖了解 MRO 是如何工作的,但我無法理解其中的某些部分,我知道解釋器從左到右並選擇 generics 的特異性,如果是這樣,那么這是怎么發生的?
class X:
pass
class Y:
pass
class Z:
pass
class w:
pass
class A(X, Y):
pass
class B(w, Z):
pass
class D(X, w):
pass
class M(D, A, B, Z):
pass
print(M.mro())
# Output
# [<class '__main__.M'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.B'>, <class '__main__.w'>, <class '__main__.Z'>,
# <class 'object'>]
或這個
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())
有人可以幫我理解解決順序,因為對我來說,每次 inheritance 級別變得更復雜時,我感覺規則是相互矛盾的。
MRO 遵循兩個簡單的規則:
考慮M
。 根據規則 1, M
必須出現在B
、 A
和Z
之前。 根據規則 2, B
必須在A
之前,並且A
必須在Z
之前。
請注意,並非總是可以找到遵守這些規則的 MRO,在這種情況下,您會立即收到錯誤消息:
>>> class X: pass
...
>>> class Y: pass
...
>>> class A(X, Y): pass
...
>>> class B(Y, X): pass
...
>>> class C(A, B): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create a consistent method resolution
order (MRO) for bases X, Y
A
和B
都很好,但找不到C
的 MRO。 在C
的 MRO 中, X
必須在Y
之前,因為C
繼承自A
但是因為C
也繼承自B
,所以Y
必須在X
之前。 沒有滿足這兩個約束的排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.