10

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'>]

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

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

4

1 回答 1

11

直接来自文档

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

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

于 2013-11-07T05:55:43.800 回答