【问题标题】:Trying to understand Python MRO, but confused with its resolution order试图理解 Python MRO,但对其解析顺序感到困惑
【发布时间】:2021-02-01 15:28:18
【问题描述】:

所以我试图了解 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())

有人能帮我理解解决顺序吗,因为对我来说,感觉就像规则相互矛盾,每次继承级别都会变得更复杂。

【问题讨论】:

    标签: python method-resolution-order


    【解决方案1】:

    MRO 遵循两个简单的规则:

    1. 在 MRO 中,每个类都在其祖先之前。
    2. 如果一个班级有多个父级,则父级在 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 之前。没有同时满足这两个约束的排序。

    【讨论】:

    • 感谢您的回复。所以根据我得到的顺序,在第二个例子中应该是'M','B','A','Y','X'和'Z',但它是完全不同的。我分享的第一个例子让我们更难理解解析顺序。我觉得我错过了什么,是吗?
    猜你喜欢
    • 2017-03-20
    • 2013-05-15
    • 2012-03-22
    • 2012-03-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多