gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:36:03 25 4
gpt4 key购买 nike

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

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

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

例如,当定义/创建一个新的子类来改变现有类的 mro 时,现有类的 .__mro__ 是否立即更新?这是否发生在每次创建新类(class)时?这使它成为类类型的一部分?哪一部分? ..或者这就是 type.mro() 的意义所在?

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

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

编辑:不确定这有多相关,但是 type('whatever').mro() 返回一个列表,而 type('whatever').__mro__ 返回一个元组。 (Un?)幸运的是,附加到该列表不会更改 __mro__ 或随后对相关类型的 .mro() 的调用(在这种情况下,海峡)。

感谢您的帮助!

最佳答案

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

关于python-3.x - 是否有令人信服的理由调用 type.mro() 而不是直接迭代 type.__mro__ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32366701/

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