2013-10-31 47 views
5

我偶然发现了这个额外的,当我使用__metaclass__ = abc.ABCMeta时没有强调mro方法。它似乎与__mro__相同,除了它返回一个列表而不是一个元组。下面是一个随便举个例子(ideone snippet):mro方法和类的__mro__属性有什么区别?

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__不是?

回答

7
the documentation

直接:

这种方法可以通过元类被覆盖以自定义其实例方法解析顺序。它在类实例化时调用,其结果存储在__mro__中。

不言自明,我...

mro()被称为上instanciation和存储其在__mro__结果。他们并没有真正的目的。

+1

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

+0

@burnpanck。 '__mro__'被'super'显式使用:https://docs.python.org/3/reference/datamodel.html#invoking-descriptors –

相关问题