试图理解Python MRO,但对其解析顺序感到困惑
所以我试图理解MRO是如何工作的,但我无法理解它的某些部分,我理解解释器从左到右选择特殊性而不是泛型,如果是这样,那么这是如何发生的试图理解Python MRO,但对其解析顺序感到困惑,python,method-resolution-order,Python,Method Resolution Order,所以我试图理解MRO是如何工作的,但我无法理解它的某些部分,我理解解释器从左到右选择特殊性而不是泛型,如果是这样,那么这是如何发生的 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
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'>]
X类:
通过
Y类:
通过
Z类:
通过
w类:
通过
A类(X,Y):
通过
B类(w、Z):
通过
D类(X,w):
通过
M类(D、A、B、Z):
通过
打印(M.mro())
#输出
# [, ,
# , ,
# ]
还是这个
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())
X类:
通过
Y类:
通过
Z类:
通过
A类(X,Y):
通过
B类(Y、Z):
通过
M类(B、A、Z):
通过
#输出:
# [,
# ,
# ,
# ]
打印(M.mro())
有人能帮我理解解析顺序吗?因为在我看来,每次继承级别变得更复杂时,规则都会相互矛盾。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
>>X级:通过
...
>>>Y班:通过
...
>>>A类(X,Y):合格
...
>>>B级(Y、X):合格
...
>>>丙(甲、乙)级:及格
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:无法创建一致的方法解析
底座X、Y的订单(MRO)
A
和B
可以,但找不到C
的MRO。在C
的MRO中,X
必须在Y
之前,因为C
继承自A
。但是由于C
也继承自B
,Y
必须在X
之前。没有满足这两个约束条件的订单。谢谢您的回复。因此,根据我得到的结果,在第二个例子中,顺序应该是'M','B','A','Y','X','Z',但它是完全不同的。我分享的第一个例子只是让我们更难理解解决顺序。我觉得我错过了什么,是吗?