是否有令人信服的理由调用 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 tuple
和 type(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__
.
是否有令人信服的理由调用 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 tuple
和 type(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__
.