class A:
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
B() # output: hello
На всех других языках я работал с супер конструктором, вызывается неявно. Как каждый вызывает его в Python? Я ожидал бы super(self)
но это не работает.
super ()
возвращает родительский объект в классах нового стиля :
class A(object):
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
super(B, self).__init__()
B()
Один из способов - вызвать конструктор A и передать self
в качестве аргумента, например, так:
class B(A):
def __init__(self):
A.__init__(self)
print "hello"
Преимущество этого стиля в том, что он очень понятен. Он вызывает инициализатор A. Недостатком является то, что он не очень хорошо справляется с ромбовидным наследованием, поскольку в итоге вы можете вызвать инициализатор общего базового класса дважды.
Другой способ - использовать super(), как было показано другими. Для одиночного наследования он делает практически то же самое, позволяя вызывать инициализатор родительского класса.
Однако super() довольно сложнее в использовании и иногда может быть неинтуитивным в ситуациях множественного наследования. С другой стороны, super() можно использовать для работы с ромбовидным наследованием. Если вы хотите узнать все тонкости работы super(), то лучшее объяснение того, как работает super(), я нашел здесь (хотя я не обязательно поддерживаю мнение этой статьи).
С классами старого стиля Python 2.x это было бы так:
class A:
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
A.__init__(self)