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