Зачем нужен super(), если можно и без него?

Я начинаю изучать классы и столкнулся с super.

class B:
    def c(self):
        print(1)

class A(B):

    def __init__(self):
        A.c(self)
A()

Так код выведет 1, но если использовать super:

class B:
    def c(self):
        print(1)

class A(B):

    def __init__(self):
        super().c()
A()

тоже 1, у меня вопрос зачем нужен super?


Ответы (2 шт):

Автор решения: Zhihar

потому что вы записали код, в котором особенности super() никак не используются

Вот какой код вам надо было бы привести:

class B:
    def c(self):
        print("B::c")

class A(B):
    def c(self):
        print("A::c")

    def __init__(self):
        A.c(self) # вызывается родной метод c

A()

class D:
    def c(self):
        print("D::c")

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

    def __init__(self):
        super().c() # вызывается метод c родительского класса D

C()

В первом случае через A.c(self) вы вызовете родной метод, а через super().c() _ родительский

У вас же чаще всего будут ситуации, когда и у родителя и у потомка есть один и тот же метод и какой именно вызвать - родной (дочерний) или родительский как раз и будет решаться через вызов super()

→ Ссылка
Автор решения: CrazyElf

Основной смысл в том, чтобы класс-наследник мог вызывать какие-то методы класса-родителя, при этом не указывая название класса-родителя в явном виде. Это удобно на тот случай, если вы захотите поменять название класса-родителя или просто унаследоваться от другого класса. В этом случае вы просто поменяете родителя в заголовке класса и вам не надо будет бегать по коду искать все места использования родителя в потомке, чтобы поменять их. Если у вас используется super(), то совершенно не важно, как называется класс-родитель, к нему доступ будет точно так же через super() и ничего в коде не нужно будет менять.

→ Ссылка