在不覆盖方法的子类中调用super()。method()

时间:2019-05-29 18:50:31

标签: python inheritance override super method-resolution-order

super的{​​{3}}状态:

  

这对于访问已在类中重写的继承方法很有用。

在不是 覆盖super().method()的子类中调用method有意义吗?

对我来说,没有,因为调用self.method()是完全相同的,也就是说继承将在method的超类中使用相同的{{1}查找self }方法解析顺序(由type(self).__mro__的超类层次结构的Python documentation决定)比self的顺序。

在我看来,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

1 个答案:

答案 0 :(得分:0)

正如@chepner所指出的,在不覆盖super().method()的子类中调用method与调用self.method()是完全相同的。差异仅出现在该子类的子类中。

比较:

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

class B:
    pass

class C(B, A):
    def g(self):
        super().f()
        print("C")

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

D().g()  # prints A C

具有:

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

class B:
    pass

class C(B, A):
    def g(self):
        self.f()
        print("C")

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

D().g()  # prints D C