当我在使用__metaclass__ = abc.ABCMeta
时,偶然发现了这个额外的、没有下划线的mro
方法。它看起来与__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__
不能完成吗?
mro()
的标准实现是否使用__mro__
作为缓存,以便不重新计算?如果是的话,那就是使用__mro__
的原因,并且应该被视为一种实现细节。否则,它的目的是什么? - burnpanck__mro__
被super
显式使用:https://docs.python.org/3/reference/datamodel.html#invoking-descriptors - Mad Physicist