是否有令人信服的理由调用type.mro()而不是直接在type.__mro__上迭代?它的访问速度要快13倍(36 ns比488 ns)
我在寻找缓存type.mro()时偶然发现了它。这似乎是合法的,但它让我怀疑:我可以依赖type.__mro__,还是我必须打电话给type.mro()?在什么条件下我才能摆脱前者呢?
更重要的是,要使type.__mro__无效,必须发生哪些条件集?
例如,当定义/创建一个更改现有类的mro的新子类时,是否立即更新了现有类的.__mro__?这种情况是否发生在每一个新类的创建上?让它成为阶级类型的一部分?哪一部分?..or是type.mro()的意思吗?
当然,假设type.__mro__实际上是指向给定类型的mro中的对象的缓存名称的元组。如果这个假设是不正确的,那是什么?(可能是描述符之类的)为什么我不能使用它呢?
编辑:如果它是一个描述符,那么我很乐意学习它的魔力:type(type.__mro__) is tuple和type(type(type).__mro__) is tuple (即:可能不是描述符)
编辑:不确定这有多重要,但是type('whatever').mro()返回一个列表,而type('whatever').__mro__返回一个元组。(Un?)幸运的是,附加到该列表中不会更改对所讨论类型(在本例中为str)上的/的/的__mro__或后续调用。
谢谢你的帮助!
发布于 2015-09-03 04:33:26
根据文档
class.__mro__此属性是在方法解析过程中查找基类时所考虑的类的元组。class.mro()元类可以重写此方法,以自定义其实例的方法解析顺序。在类实例化时调用,其结果存储在中。
因此,是的,您关于__mro__是缓存的假设是正确的。如果元类的mro()总是返回相同的内容,或者如果您没有任何元类,则可以安全地使用__mro__。
https://stackoverflow.com/questions/32366701
复制相似问题