是否有令人信服的理由致电type.mro()
而不是直接迭代type.__mro__
?它的访问速度要快13倍(36ns vs 488 ns)
我在寻找缓存type.mro()
时偶然发现了它。它似乎合法,但它让我想知道:我可以依靠type.__mro__
,还是我必须致电type.mro()
?在什么条件下,我可以逃脱前者?
更重要的是,type.__mro__
无效会产生哪些条件?
例如,当定义/创建一个改变现有类的mro的新子类时,现有的类是' .__mro__
立即更新了?这会在每个新类创建时发生吗?这使它成为班级类型的一部分?哪一部分? ..或type.mro()
是什么意思?
当然,所有这一切都假设type.__mro__
实际上是一个指向给定类型的对象的缓存名称元组的mro。如果这个假设不正确;那这是什么? (可能是描述符或其他东西..)以及为什么我可以/不能使用它?
编辑:如果它是一个描述符,那么我喜欢学习它的魔力,如:type(type.__mro__) is tuple
和type(type(type).__mro__) is tuple
(即:可能不是描述符)
编辑:不确定这是多么相关,但type('whatever').mro()
返回一个列表,而type('whatever').__mro__
返回一个元组。 (联合国?)幸运的是,附加到该列表并不会更改__mro__
或之后对所讨论类型的.mro()
的调用(在本例中为str)。
感谢您的帮助!
答案 0 :(得分:4)
根据docs:
class.__mro__
此属性是在方法解析期间查找基类时考虑的类的元组。
class.mro()
可以通过元类重写此方法,以自定义其实例的方法解析顺序。 在类实例化时调用,其结果存储在
__mro__
中。
所以,是的,关于__mro__
作为缓存的假设是正确的。如果你的元类' mro()
总是返回相同的内容,或者如果您没有任何元类,则可以安全地使用__mro__
。