Python-新型类中的方法解析顺序(MRO)?

在《Nutshell的Python》(第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__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)

我不确定我对新样式类的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:因此,在查找Dx时,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被迫来到分辨率顺序只有一次,毕竟它的子类,从而使覆盖(即尺寸材料的的覆盖x)实际上有效地工作。

这是应避免使用旧式类的原因之一:“菱形”模式的多重继承对它们不起作用,而对新式则可行。

以上是 Python-新型类中的方法解析顺序(MRO)? 的全部内容, 来源链接: utcz.com/qa/413790.html

回到顶部