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

时间:2015-09-03 03:57:04

标签: python-3.x python-3.4 method-resolution-order

是否有令人信服的理由致电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 tupletype(type(type).__mro__) is tuple(即:可能不是描述符)

编辑:不确定这是多么相关,但type('whatever').mro()返回一个列表,而type('whatever').__mro__返回一个元组。 (联合国?)幸运的是,附加到该列表并不会更改__mro__或之后对所讨论类型的.mro()的调用(在本例中为str)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

根据docs

  

class.__mro__

     

此属性是在方法解析期间查找基类时考虑的类的元组。

     

class.mro()

     

可以通过元类重写此方法,以自定义其实例的方法解析顺序。 在类实例化时调用,其结果存储在__mro__ 中。

所以,是的,关于__mro__作为缓存的假设是正确的。如果你的元类' mro()总是返回相同的内容,或者如果您没有任何元类,则可以安全地使用__mro__