super in python 3、当class只有继承函数

super in python 3, when class only has inherited function

关于 super() 的新手问题:在下面的玩具示例中,令我惊讶的是输出是 C 而不是 A,因为 J 继承了 foo 来自 A。这是代码:

class A:
    def foo(self):
        return 'A'


class C(A):
    def foo(self):
        return 'C'


class J(A):
    pass


class E(J, C):

    def f(self):
        return super().foo()

    def foo(self):
        return 'E'

print(E().f())

JA 继承了 foo; E 的 MRO 是:

(<class '__main__.E'>, <class '__main__.J'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

为什么 'A' 不是 return 值?即评估进行到 C

classsuper不只是恢复超class。它实例化一个对象,该对象在给定的 方法解析顺序 的上下文中恢复方法。此 在 Python 中重新实现了 super,以帮助您了解它如何解析方法继承。

因此,如您所见,class 的 方法解析顺序 (E, J, C, A, object)。因为它先出现,所以 EC 而不是 A 继承 foo

现在您可能要问的问题是...

为什么 CA 之前?

构建 mroC3 linearization algorithm 具有 属性 如果某些 class X 继承自 Y, 那么它将在 mro.

中出现在 Y 之前

如您所见,您的示例尊重这一点。 class C 继承自 A 因此必须排在第一位。

以下示例演示一旦您从 C 中删除 A 继承,结果就会变成您错误地期望的结果。

class A:
    pass

class C: # Dropped A inheritance
    pass

class J(A):
    pass

class E(J, C):
    pass

E.__mro__ # (E, J, A, C, object)