gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:50:38 28 4
gpt4 key购买 nike

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

最佳答案

直接来自 the documentation :

This method can be overridden by a metaclass to customize the method resolution order for its instances. It is called at class instantiation, and its result is stored in _mro_.

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

关于python - mro 方法和类的 __mro__ 属性有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713585/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com