Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解Python MRO,但对其解析顺序感到困惑_Python_Method Resolution Order - Fatal编程技术网

试图理解Python 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

所以我试图理解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'>]
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遵循两个简单的规则:

  • 在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',但它是完全不同的。我分享的第一个例子只是让我们更难理解解决顺序。我觉得我错过了什么,是吗?