首页 > 解决方案 > 为什么基类在这种多重继承中不起作用?

问题描述

我对解释以下代码的 MRO 和 C3 线性化算法感到困惑,请您帮帮我吗?

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

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

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

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

d = D()
d.go()
pprint.pprint(D.__mro__)

The Result is:
C
B
D
(<class '__main__.D'>,
 <class '__main__.B'>,
 <class '__main__.C'>,
 <class '__main__.A'>,
 <class 'object'>)

再比如:如果我在C类中取消注释super语句,在B类中注释super语句,结果会是“B D”,没有C和A。为什么?!!!!!!(我确实理解深度优先,从左到右的规则,但是……)

标签: pythonmethod-resolution-order

解决方案


super()方法只是根据 MRO 找到要调用的下一个方法。

D.go()调用B.go(),然后调用C.go(),它打印C并返回到B.go()哪个打印B,最后返回到D.go()哪个打印D

如果您希望go()调用所有方法,则必须取消注释中的super()调用C.go()

super()您可以在Guido 自己的博客中找到更多关于 MRO 的信息并致电


推荐阅读