Вызов super (). Method () в подклассе, который не переопределяет метод - PullRequest
0 голосов
/ 29 мая 2019

Документация Python из super состояния:

Это полезно для доступа к унаследованным методам, которые были переопределены в классе.

Есть ли смысл вызывать super().method() в подклассе, который не переопределяет method?

Для меня это не так, поскольку вызов self.method() будет в точности идентичным, то есть наследование будет искать method в суперклассах self с использованием того же порядка разрешения type(self).__mro__ метода (заданного C3 линеаризация иерархии суперклассов 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

но не в этом:

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

1 Ответ

0 голосов
/ 30 мая 2019

Как отметил @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
...