Python的super()有效吗?

时间:2017-04-23 16:46:24

标签: python

我的程序是这样的:

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


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


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


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


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


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

print(e.go())

以下是此输出:

A
D
C
B
E
None

我很好奇super()的工作流程,它如何在B之前打印D,C,为什么最后打印无?非常感谢详细解释。

1 个答案:

答案 0 :(得分:2)

如果您致电help(e),则可以看到method resolution order

>>> e = E()
>>> help(e)
class E(B, C, D)
 |  Method resolution order:
 |      E
 |      B
 |      C
 |      D
 |      A
 |      builtins.object

由于您先拨打super然后print,因此输出将完全相反mro

A -> D -> C -> B -> E

如果您在print之前有super个电话,那么它将跟随MRO:

E -> B -> C -> D -> A

然而,E.go并未返回任何内容(如果之前没有其他return Nonereturn是隐式的),那么它将在之后打印None已经调用了所有方法。