Python: Зачем вызывать ‘__init__’ вместо className() ?

#python #constructor #initialization

#python #конструктор #инициализация

Вопрос:

Поскольку вызов className() приведет к выполнению кода __init__(args) , почему в приведенном ниже коде кто-то явно вызывает __init__ ?

 class Example(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)   
  

Есть ли какая-либо разница в фактическом коде, который выполняется между двумя вызовами метода, или выбор __init__() className() просто произвольный?

Запуск Python 3.4

Ответ №1:

className() делает больше, чем вызов __init__ . Он также вызывает __new__ , который создает новый экземпляр класса. Таким образом, вызов Frame() не будет выполнять инициализацию суперкласса для того же self объекта; он создаст новый объект и инициализирует его.

Вы вызываете __init__ , когда хотите запустить только __init__ конкретный экземпляр, который вы уже создали. Обычно это происходит в ситуации, подобной той, которую вы показываете, когда вы хотите, чтобы суперкласс выполнял свою инициализацию поверх инициализации подкласса.

Комментарии:

1. значит, вызов фрейма __init__ похож на вызов super() в Java?

2. @joshsvoss: Возможно. Я действительно не знаю Java. Мой опыт ответов на вопросы на этом сайте заключается в том, что люди обычно лучше понимают, если пытаются понять, что на самом деле делает Python, вместо того, чтобы отображать его на Java.

3. Вы также можете использовать super(Frame, self).__init__(parent) , но, признаюсь, я не совсем понимаю разницу в этом контексте.

4. @daniel: Да, это своего рода отдельная проблема. В принципе super , способ более гибкий, если вы позже измените иерархию классов.

5. Ах, мило. Спасибо @BrenBarn