gpt4 book ai didi

Python MRO - 在多重继承中使用 super

转载 作者:行者123 更新时间:2023-11-28 17:55:33 24 4
gpt4 key购买 nike

我有这段代码,其中使用了超继承和多重继承。类的结果是:

go A go!
go C go!
go B go!
go D go!

虽然我希望:

go A go!
go B go!
go D go!

根据我的理解:D 因为 MRO 调用 B 类,因为 Go 是在 B 中实现的。B 类调用其父 A 的 super。A 被执行,这就可以了。然后我希望 B 继续执行,所以这意味着 B 被执行,最后 D 被执行。但这当然是不正确的。为什么进入C,因为go方法的定义在B中找到,然后它不应该再在C中搜索。MRO就是这样工作的。它发现在头等舱,它不应该再搜索了。完全糊涂了:(

 class A(object):
def go(self):
print("go A go!")

class B(A):
def go(self):
super(B, self).go()
print("go B go!")

class C(A):
def go(self):
super(C, self).go()
print("go C go!")

class D(B,C):
def go(self):
super(D, self).go()
print("go D go!")

a = A()
b = B()
c = C()
d = D()

d.go()

最佳答案

Raymond Hettinger(核心 Python 开发人员)在 PyCon 上有一个很棒的视频 here .

主要的收获是 super 不会调用你的 parent ,它会调用你后代的祖先。因此,每当您调用 super 时,它都会返回到您实际调用该方法的实例,并在 MRO 中查找下一个类型(即使有多重继承也是有保证的顺序,为什么 class D(B,C)class D(C, B) 不同。

在您的例子中,D 的 MRO 是 (D,B,C,A)。当D.go 调用super 时,它会调用B.go。当它调用 super 时,它仍在使用 D 的 MRO,因此它移动到下一个类型,在你的情况下 C 又调用 A。最终结果是你的打印语句在 D 的 MRO 中执行相反。

There is also a blog by RH here如果您无法观看 youtube,它也涵盖了相同的主题。

关于Python MRO - 在多重继承中使用 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58702633/

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