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

Air*_*Air 5 python abc method-resolution-order

mro当我使用时,我偶然发现了这种额外的,没有下划线的方法__metaclass__ = abc.ABCMeta.它似乎是相同的,__mro__除了它返回一个列表而不是一个元组.这是一个随机的例子(ideone片段):

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'>]
Run Code Online (Sandbox Code Playgroud)

我后来发现这并不是唯一的,ABCMeta但在所有新式课程中都可以使用.

所以为什么?这是做什么__mro__的不是?

Jer*_*meJ 8

直接来自文档:

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

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

mro()在instanciation上调用并将其结果存储在__mro__.它们实际上并没有相同的目的.

  • 那么我什么时候该使用哪个呢?标准的`mro()`实现是否使用`__mro__`作为缓存,因为它不会重新计算?如果是,那么这就是`__mro__`的原因,应被视为实现细节。否则,它的目的是什么? (2认同)