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())
J
从 A
继承了 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)
。因为它先出现,所以 E
从 C
而不是 A
继承 foo
。
现在您可能要问的问题是...
为什么 C
在 A
之前?
构建 mro 的 C3 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)
关于 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())
J
从 A
继承了 foo
; E 的 MRO 是:
(<class '__main__.E'>, <class '__main__.J'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
为什么 'A' 不是 return 值?即评估进行到 C
classsuper
不只是恢复超class。它实例化一个对象,该对象在给定的 方法解析顺序 的上下文中恢复方法。此 super
,以帮助您了解它如何解析方法继承。
因此,如您所见,class 的 方法解析顺序 是 (E, J, C, A, object)
。因为它先出现,所以 E
从 C
而不是 A
继承 foo
。
现在您可能要问的问题是...
为什么 C
在 A
之前?
构建 mro 的 C3 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)