所以我试图理解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
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())
有人能帮我理解解析顺序吗?因为在我看来,每次继承级别变得更复杂时,规则都是相互矛盾的
MRO遵循两条简单规则:
考虑^ {CD1>}。根据规则1,
M
必须出现在B
、A
和Z
之前。根据规则2,B
必须在A
之前,并且A
必须在Z
之前请注意,并不总是能够找到符合这些规则的MRO,在这种情况下,您会立即得到一个错误:
A
和B
都很好,但没有发现C
的MRO。在C
的MRO中,X
必须在Y
之前,因为C
继承自A
。但是因为C
也继承自B
,所以Y
必须在X
之前。没有满足这两个约束的排序相关问题 更多 >
编程相关推荐