【问题标题】:How to check MRO (Method Resolution Order) in Python 2.7?如何在 Python 2.7 中检查 MRO(方法解析顺序)?
【发布时间】:2019-08-30 15:39:05
【问题描述】:

在 Python 3 中,我可以执行以下操作:

>>> class A:
...     pass
...
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]

但在 Python 2.7.16 中,我得到一个 AttributeError

>>> class A:
...     pass
...
>>> A.mro()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute 'mro'
>>> A.__mro__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute '__mro__'

我知道,如果我们转换为“新”样式对象(继承自 object),这个问题就会消失:

>>> class A(object):
...     pass
...
>>> A.mro()
[<class '__main__.A'>, <type 'object'>]

但我的用例在pdb,我正在处理大量需要大量重构的对象,有没有办法使用旧式类访问 MRO?

【问题讨论】:

  • 相关:stackoverflow.com/q/4015417/1324033 - “在 Python 2 中:总是显式地从对象继承。”
  • 此时,旧式类应该被认为是一个错误,而不是需要解决的问题。 Python 2 几乎已经死了。当我说这个问题比 Stack Overflow 更适合于 retrocomputing.stackexchange.com 时,我主要是在开玩笑,但并不完全是。

标签: python python-2.7 pdb method-resolution-order


【解决方案1】:

旧式类没有明确的解析顺序;相反,方法解析取决于父类集的传递闭包。

来自The Python 2.3 Method Resolution Order(强调我的):

首先,我要指出的是,我要说的仅适用于 Python 2.2 中引入的新样式类:经典类保持其旧的方法解析顺序,深度优先,然后从左到右。

如果将解析顺序作为显式数据公开,那将是一个实现细节,而不是语言定义的接口的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2010-12-23
    • 2021-03-05
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多