В чем разница между конструктором и инициализатором в python?
Возможный дубликат:
Python (и API Python C): новый по сравнению с init
Я сейчас в колледже, и лектор использовал термины конструкторы и инициализаторы взаимозаменяемо. Я почти уверен, что это неправильно.
Я пробовал найти ответ, но не нашел ответ, который я ищу.
Ответы
Ответ 1
В большинстве языков OO они являются одним и тем же шагом, поэтому он не ошибается в таких вещах, как java, С++ и т.д. В python они выполняются в два этапа: __new__
- это конструктор; __init__
- инициализатор.
Здесь - еще один ответ, который более подробно описывает различия между ними.
Ответ 2
Почти во всех обычных случаях Python не имеет конструкторов в том же смысле, что и другие языки OO, потому что ручное управление памятью обычно обескураживает. Вместо этого то, что вы обычно должны делать, это определить метод __ init __ для класса. Этот метод вызывается для инициализации нового объекта экземпляра автоматически, сначала после его построения. Таким образом, на самом деле это не конструктор, и говорить о нем как о конструкторе может смутить некоторых людей.
Конечно, некоторые люди хотят назвать его конструктором, потому что он используется немного как конструктор - в принципе вы можете называть его любым, что хотите, пока все понимают, о чем вы на самом деле обращаетесь. Но в целом, чтобы быть явным и понять себя, назовите его методом init или чем-то другим, кроме конструктора. По сути, разные языки просто имеют несколько разную терминологию и говорят очень четко, всегда будет требовать корректировки вашего предмета и аудитории.
В Python можно управлять созданием экземпляра и уничтожением при более тонкой детализации, хотя вы не захотите, если не знаете, что делаете. Это делается путем определения методов __ new __ и __ del __ для захвата объектов и операторов del. Являются ли эти критерии как конструкторы и деструкторы точнее, являются немного более спорными (документы Python называют метод del деструктором, но имеют тенденцию быть более неопределенными в том, что представляет собой конструктор, например, включая множество функций, возвращающих экземпляры объектов). Я по-прежнему призываю вас использовать конкретную терминологию для данного языка, а также в сравнительных дискуссиях, чтобы определить свои термины впереди. Как всегда, ваш выбор терминов во время разговора включает компромиссы между аудиторией, которая может легко следовать за вами и аудиторией, потенциально приводящей в замешательство: если вы говорите об управлении памятью, возможно, должны быть как можно более конкретными, но если вы говорите свободно, просто используйте некоторое слово, которое ваша аудитория понимает и будет готова уточнить.
Твой инструктор в худшем случае неясно, я не знаю ни одного канонического определения этих терминов, но они могут вызвать путаницу для людей, которые узнали очень конкретные определения с других языков.
Ответ 3
http://docs.python.org/reference/datamodel.html#basic-customization
__new__
- конструктор.
__init__
- инициализатор.