mro方法和类的__mro__属性有什么区别?

时间:2013-10-31 18:00:52

标签: python abc method-resolution-order

当我使用mro时,我偶然发现了这个额外的,没有下划线的__metaclass__ = abc.ABCMeta方法。它似乎与__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__不是?

1 个答案:

答案 0 :(得分:8)

直接来自the documentation

  

可以通过元类重写此方法,以自定义其实例的方法解析顺序。它在类实例化时调用,其结果存储在__mro__

对我来说很明显......

在实例化时调用

mro()并将其结果存储在__mro__中。他们并没有真正的目的。