Как вызвать супер конструктора в Python?

class A:
    def __init__(self):
        print("world")

class B(A):
    def __init__(self):
       print("hello")

B()  # output: hello

На всех других языках я работал с супер конструктором, вызывается неявно. Как каждый вызывает его в Python? Я ожидал бы super(self) но это не работает.

330
задан Flow 30 August 2019 в 00:32
поделиться

3 ответа

super () возвращает родительский объект в классах нового стиля :

class A(object):
    def __init__(self):
        print("world")

class B(A):
    def __init__(self):
        print("hello")
        super(B, self).__init__()

B()
320
ответ дан 23 November 2019 в 00:46
поделиться

Один из способов - вызвать конструктор A и передать self в качестве аргумента, например, так:

class B(A):
    def __init__(self):
        A.__init__(self)
        print "hello"

Преимущество этого стиля в том, что он очень понятен. Он вызывает инициализатор A. Недостатком является то, что он не очень хорошо справляется с ромбовидным наследованием, поскольку в итоге вы можете вызвать инициализатор общего базового класса дважды.

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

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

32
ответ дан 23 November 2019 в 00:46
поделиться

С классами старого стиля Python 2.x это было бы так:

class A: 
 def __init__(self): 
   print "world" 

class B(A): 
 def __init__(self): 
   print "hello" 
   A.__init__(self)
​​
52
ответ дан 23 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: