gpt4 book ai didi

python - 在不重写方法的子类中调用 super().method()

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:29 25 4
gpt4 key购买 nike

Python documentation super 状态:

This is useful for accessing inherited methods that have been overridden in a class.

在子类中调用 super().method() 是否有必要覆盖method

对我来说没有,因为调用 self.method() 是等效的,也就是说继承会在 self 中查找 method code> 的父类(super class)使用与 super 相同的 type(self).__mro__ 方法解析顺序(由 self 的父类(super class)层次结构的 C3 linearization 给出) .

所以对我来说,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

最佳答案

正如 @chepner 所指出的,在不重写 method 的子类中调用 super().method() 不等于调用 self.method()。差异出现在重写方法的子类的子类中。

比较:

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

class B:
pass

class C(B, A):
def g(self):
super().f() # == super(C, self).f(), so lookup starts after C in type(self).__mro__
print("C")

class D(C):
def f(self):
print("D")

D().g() # prints A C, since D.__mro__ == (D, C, B, A, object)

与:

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

class B:
pass

class C(B, A):
def g(self):
self.f() # lookup starts at the beginning in type(self).__mro__
print("C")

class D(C):
def f(self):
print("D")

D().g() # prints D C, since D.__mro__ == (D, C, B, A, object)

关于python - 在不重写方法的子类中调用 super().method(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56366824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com