是否有令人信服的理由调用 type.mro() 而不是直接迭代 type.__mro__?

Is there a compelling reason to call type.mro() rather than iterate over type.__mro__ directly?

是否有令人信服的理由调用 type.mro() 而不是直接迭代 type.__mro__?访问速度实际上快了 13 倍(36 纳秒对 488 纳秒)

我在寻找缓存时偶然发现了它 type.mro()。这似乎是合法的,但它让我想知道:我可以依赖 type.__mro__,还是必须调用 type.mro()?在什么情况下我可以摆脱前者?

更重要的是,要使 type.__mro__ 无效,必须满足哪些条件?

例如,当一个新的 subclass 是 defined/created 改变现有 class 的 mro 时,现有的 class' .__mro__马上更新?这是否会在每个新的 class 创作中发生?这使它成为 class 类型的一部分?哪一部分? ..或者这就是 type.mro() 的意思?

当然,所有假设 type.__mro__ 实际上都是指向给定类型的 mro 中的对象的缓存名称的元组。如果该假设不正确;那这是什么? (可能是描述符之类的东西。)以及为什么 can/can 我不使用它?

编辑:如果它是一个描述符,那么我很想学习它的魔力,因为两者都是:type(type.__mro__) is tupletype(type(type).__mro__) is tuple(即:可能不是描述符)

编辑:不确定这有多相关,但是 type('whatever').mro() returns 是一个列表,而 type('whatever').__mro__ returns 是一个元组。 (Un?)幸运的是,附加到该列表不会更改 __mro__ 或后续调用 .mro() of/on 有问题的类型(在本例中为 str)。

感谢您的帮助!

根据 docs:

class.__mro__

This attribute is a tuple of classes that are considered when looking for base classes during method resolution.

class.mro()

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() 总是 returns 相同的东西,或者如果你没有任何元类,你可以安全地使用 __mro__.