【发布时间】:2019-05-29 18:50:30
【问题描述】:
super 的 Python documentation 声明:
这对于访问已在类中被覆盖的继承方法很有用。
在不覆盖method的子类中调用super().method()有什么意义吗?
对我来说没有,因为调用self.method() 是等价的,也就是说,继承将在self 的超类中使用相同的type(self).__mro__ 方法解析顺序(由@ 给出self 的超类层次结构中的 987654322@)比 super。
所以对我来说,super 在这种情况下很有用:
class A:
def f(self):
print("A")
class B:
pass
class C(B, A):
def f(self):
super().f()
print("C")
C().f() # prints A C
但不在这个:
class A:
def f(self):
print("A")
class B:
pass
class C(B, A):
def g(self):
super().f() # should be just self.f()
print("C")
C().g() # prints A C
【问题讨论】:
-
视情况而定。请记住,在
C中,您不知道super()将引用哪个类。这是在运行时确定的,self可能是您不知道的C的某个后代的实例。 那个类可能会覆盖f。 -
(也就是说,您的“无用”示例实际上比无用更糟糕,因为它可能会主动阻止首先调用正确的方法。)
-
@chepner 是的,
super().f()在C中你不知道它会引用哪个类,但self.f()也不知道,是吗? -
但是您并没有主动跳过
self.f()的实现。你给type(f).f一个运行的机会,让它决定是否需要调用它覆盖的方法。 -
@chepner 我想你的意思是
type(self).f。好的,我明白了:如果我创建了C的子类D并在其中覆盖了f,则调用D.g将调用D.f和self.f()但A.f和super().f(),对吗?
标签: python inheritance overriding super method-resolution-order