#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