gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:11:13 29 4
gpt4 key购买 nike

Python in a Nutshell (2nd Edition)一书中有一个例子,它使用
旧样式类,用于演示如何以经典解析顺序解析方法和
新订单有什么不同。

我通过用新样式重写示例来尝试相同的示例,但结果与使用旧样式类获得的结果没有什么不同。我用来运行示例的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'

这里,legacy-style,解析顺序是 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)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1848474/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com