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

Dej*_*jan 5 python super method-resolution-order python-3.x

我有这段代码,其中使用了超级继承和多重继承。班级成绩是:

go A go!
go C go!
go B go!
go D go!
Run Code Online (Sandbox Code Playgroud)

虽然我期望:

go A go!
go B go!
go D go!
Run Code Online (Sandbox Code Playgroud)

根据我的理解: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()
Run Code Online (Sandbox Code Playgroud)

che*_*ner 0

当您调用 时d.go(),每次调用都会super使用调用实例的 MRO(在本例中,dMRO 为 D、B、C、A、对象。super不一定引用它静态出现的类的父级。

这在 的定义中最为明显B.go。尽管 的定义B一无所知C,但它的self参数是对类型对象的引用,而MROD中的下一个类是 is 、 not 。DBCA