【问题标题】:What's the difference between the mro method and the __mro__ attribute of a class?mro 方法和类的 __mro__ 属性有什么区别?
【发布时间】:2013-11-11 21:01:31
【问题描述】:

我在使用__metaclass__ = abc.ABCMeta 时偶然发现了这个额外的、没有下划线的mro 方法。它似乎与__mro__ 相同,只是它返回的是列表而不是元组。这是一个随机示例 (ideone snippet):

import abc
import copy

class Life(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def reproduce(self):
        pass

class Bacterium(Life):
    def reproduce(self):
        return copy.deepcopy(self)

wiggly = Bacterium()

print wiggly.__class__.__mro__
# (<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>)

print wiggly.__class__.mro()
# [<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>]

后来我发现这不是 ABCMeta 独有的,而是在所有新式类中都可用。

那么……为什么? __mro__ 不是在做什么?

【问题讨论】:

    标签: python abc method-resolution-order


    【解决方案1】:

    直接来自the documentation

    此方法可以被元类覆盖,以自定义其实例的方法解析顺序。在类实例化时调用,结果存储在_mro_中。

    因此,mro() 在实例化时被调用并将其结果缓存在__mro__ 中。它们的目的相同。

    【讨论】:

    • 那么我什么时候应该使用哪个? mro() 的标准实现是否使用 __mro__ 作为缓存,因为它不会重新计算?如果是,那么这就是__mro__ 的原因,应该被视为实现细节。否则,它的目的是什么?
    • @burnpanck。 __mro__super 明确使用:docs.python.org/3/reference/datamodel.html#invoking-descriptors
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2018-04-28
    • 2021-12-26
    • 2015-09-10
    相关资源
    最近更新 更多