python – 新式类中的方法解析顺序(MRO)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 新式类中的方法解析顺序(MRO)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1642字,纯文字阅读大概需要3分钟。
内容图文
在Python in a Nutshell(第2版)一书中有一个使用的例子
旧样式类,用于演示如何以经典分辨率顺序解析方法
它与新订单有何不同.
我通过重写新样式的示例尝试了相同的示例,但结果与使用旧样式类获得的结果没有什么不同.我用来运行该示例的python版本是2.5.2.以下是示例:
class Base1(object):
def amethod(self): print "Base1"
class Base2(Base1):
pass
class Base3(object):
def amethod(self): print "Base3"
class Derived(Base2,Base3):
pass
instance = Derived()
instance.amethod()
print Derived.__mro__
调用instance.amethod()打印Base1,但根据我对MRO的理解,新类型的输出应该是Base3.调用Derived .__ mro__打印:
(< class'__main __.派生'>,< class'__ main __.Base2'>,< class'__main __.Base1'>,< class'__main __.Base3'>,< type'对象“>) 我不确定我对新样式类的MRO的理解是不正确的还是我做了一个我无法察觉的愚蠢错误.请帮助我更好地了解MRO.
解决方法:
在“天真”,深度优先的方法中,同一祖先类不止一次出现时,传统与新式类的解析顺序之间的关键区别就在于:例如,考虑一个“钻石继承”案例:
>>> class A: x = 'a'
...
>>> class B(A): pass
...
>>> class C(A): x = 'c'
...
>>> class D(B, C): pass
...
>>> D.x
'a'
在这里,传统风格,分辨率顺序是D – B – A – C – A:所以当查找D.x时,A是解决它的分辨率顺序的第一个基础,从而将定义隐藏在C中.
>>> class A(object): x = 'a'
...
>>> class B(A): pass
...
>>> class C(A): x = 'c'
...
>>> class D(B, C): pass
...
>>> D.x
'c'
>>>
在这里,新式,顺序是:
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)
与A强制进入解析顺序只有一次及其所有子类之后,所以覆盖(即C的成员x的覆盖)实际上是合理的.
这是应该避免使用旧式类的原因之一:使用“类似钻石”模式的多重继承对它们不起作用,而它与新风格一起使用.
内容总结
以上是互联网集市为您收集整理的python – 新式类中的方法解析顺序(MRO)?全部内容,希望文章能够帮你解决python – 新式类中的方法解析顺序(MRO)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。