Ответ 1
Цель супер - обработать алмазы наследования. Если класс структура наследования использует только однонаследование, тогда использование функции super() будет приводят к тем же вызовам, что и явные вызовы в "родительский" класс.
Рассмотрим этот наследование алмаза:
class A(object):
def __init__(self):
print('Running A.__init__')
super(A,self).__init__()
class B(A):
def __init__(self):
print('Running B.__init__')
super(B,self).__init__()
class C(A):
def __init__(self):
print('Running C.__init__')
super(C,self).__init__()
class D(B,C):
def __init__(self):
print('Running D.__init__')
super(D,self).__init__()
foo = D()
который печатает
Running D.__init__
Running B.__init__
Running C.__init__
Running A.__init__
а если мы изменим B
на B2
и будем использовать явные вызовы родительскому __init__
:
class B2(A):
def __init__(self):
print('Running B.__init__')
A.__init__(self)
class D2(B2,C):
def __init__(self):
print('Running D.__init__')
super(D2,self).__init__()
bar = D2()
тогда цепочка вызовов init становится
Running D.__init__
Running B.__init__
Running A.__init__
Таким образом, вызов C.__init__
полностью пропущен.
Нет предпочтительного варианта.
Если вы можете гарантировать, что не хотите поддерживать множественное наследование, тогда явные родительские вызовы проще и понятнее.
Если вы хотите поддерживать множественное наследование сейчас или в будущем, вам нужно использовать super()
. Но поймите, что есть некоторые ловушки, связанные с использованием супер, но с правильное использование этих ловушек можно избежать.