簡體   English   中英

試圖了解 Python MRO,但對其解析順序感到困惑

[英]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 遵循兩個簡單的規則:

  1. 每個 class 在 MRO 中都位於其祖先之前。
  2. 如果 class 有多個父級,則父級在 MRO 中按順序(但不一定連續)出現。

考慮M 根據規則 1, M必須出現在BAZ之前。 根據規則 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

AB都很好,但找不到C的 MRO。 C的 MRO 中, X必須在Y之前,因為C繼承自A 但是因為C也繼承自B ,所以Y必須在X之前。 沒有滿足這兩個約束的排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM