在python中,为什么super会以这种方式进行多重继承?

2024-03-29 06:04:28 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一段代码片段。我不明白为什么会这样。为什么super(B, self).go()解析为C类的go方法?你知道吗

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!")

d = D()
d.go()
# go A go!
# go C go!
# go B go!
# go D go!

Tags: 方法代码selfgoobjectdefclassprint
1条回答
网友
1楼 · 发布于 2024-03-29 06:04:28

尽管有它的名字,super并不一定是指超类。super(B, self)是指self的MRO中紧跟B的类。你知道吗

你可以看到D的MRO

>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

这意味着从d.gosuper(D, self)指向B。结果调用B.go时,super(B, self)表示C而不是A。这是因为self仍然是D的一个实例,所以D.__mro__决定了下一步调用什么,而不是B的静态超类。你知道吗

关于super要记住的最重要的事情是,在Foo.go内部,您不知道super(Foo, self)将引用什么类,因为您不知道selfFoo的实例还是Foo的后代。你知道吗

相关问题 更多 >