【问题标题】:Python's document about MRO is wrong?Python关于MRO的文档有错吗?
【发布时间】:2013-08-26 14:27:30
【问题描述】:

我今天读了这个文档。有些事情让我很困惑。

http://www.python.org/download/releases/2.3/mro/

在证明Python 2.2的MRO打破单调性的例子中,

>>> class A(object): pass
>>> class B(object): pass
>>> class C(object): pass
>>> class D(object): pass
>>> class E(object): pass
>>> class K1(A,B,C): pass
>>> class K2(D,B,E): pass
>>> class K3(D,A):   pass
>>> class Z(K1,K2,K3): pass

我认为 Python 2.2 将为 Z 提供线性化的结果是:['Z', 'K1', 'C', 'K2', 'B', 'E', 'K3', 'D', 'A', 'object'],但是,文档给出了L[Z,P22] = Z K1 K3 A K2 D B C E O

而且医生说,这个例子最初是由 Samuele Pedroni 在here 提供的,Samuele Pedroni 的回答和我的一样。

有什么我错过的吗?

【问题讨论】:

  • 为什么你认为 Python 2.2 会给出不同的结果?你试过了吗?
  • @JeromeJ:我实际上留下了两个带有mro 标签的帖子出于某种原因。 :-) 如果没有至少 一些 个帖子仍在使用它,我无法创建同义词。

标签: python method-resolution-order


【解决方案1】:

我认为 Python 2.2 将为 Z 提供线性化的结果是:['Z', 'K1', 'C', 'K2', 'B', 'E', 'K3', 'D', 'A', '对象']

你为什么这么认为?

快速尝试:

Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object): pass
...
>>> class B(object): pass
...
>>> class C(object): pass
...
>>> class D(object): pass
...
>>> class E(object): pass
...
>>> class K1(A,B,C): pass
...
>>> class K2(D,B,E): pass
...
>>> class K3(D,A):   pass
...
>>> class Z(K1,K2,K3): pass
...
>>> Z.__mro__
(<class '__main__.Z'>, <class '__main__.K1'>, <class '__main__.K3'>, <class '__m
ain__.A'>, <class '__main__.K2'>, <class '__main__.D'>, <class '__main__.B'>, <c
lass '__main__.C'>, <class '__main__.E'>, <type 'object'>)
>>>

所以 Z 的 MRO 是 Z K1 K3 A K2 D B C E object,所以文档似乎是正确的。

【讨论】:

  • 那我的下一个问题是为什么顺序是这样的? python 2.2中关于MRO的算法是什么,而不是类层次结构的左右dfs?
  • 看来你的python解释器不像我在VirtualBox(Windows XP)中安装的,当我输入z.__mro__时,解释器说class z has no attribute '__mro__'
  • 也许你会觉得这很有趣,然后:The History of Python - Method Resolution Order
  • @DepreYon 你确定你使用的是新式类吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多