2015-03-01 3 views
2

Я слышал, что __init__ функция в Python не конструктор, Это Initializer и на самом деле функция __new__ является Constructor, а разница в том, что функция __init__ вызывается после того, как создание объекта и вызов __new__. Я прав? Можете ли вы объяснить разницу лучше и зачем нам нужны и __new__ и __init__?Python - Initializer против Конструктора

+2

Проверить эту ссылку: http://stackoverflow.com/questions/674304/ pythons-use-of-new-and-init – Vinkal

+0

'__init__' * - это прямой эквивалент тому, что другие языки OO (особенно Java и C++) имеют тенденцию вызывать« конструктор ».AFAIK эти языки на самом деле не имеют * никакого прямого эквивалента '__new__'. Но, вероятно, именно потому, что эквивалент «конструктора» на самом деле ничего не создает (а также не конструкторы C++ или Java), Python имеет тенденцию ссылаться на них как на имена реальных методов, а не называть * либо * «конструктором». – lvc

ответ

4

В сущности, __new__ отвечает за создание экземпляра (таким образом, он может быть точно сказать , что конструктор, как вы уже отметили), а __init__ действительно способ инициализации состояния экземпляра. Например, рассмотрим следующее:

class A(object): 

    def __new__(cls): 
     return object.__new__(cls) 

    def __init__(self): 
     self.instance_method() 

    def instance_method(self): 
     print 'success!' 

newA = A() 

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

Что касается вашего второго вопроса, то в моем опыте редко используется __new__. Конечно, бывают ситуации, когда более продвинутые методы могут использовать __new__, но они редки. Один печально известный пример, когда люди могут искушать использование __new__, заключается в создании класса Singleton (однако, это хорошая техника или нет, однако, это не так).

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

1

__init__ вызывается с уже созданным экземпляром объекта в качестве первого параметра (обычно это называется self, но это просто имя параметра).

__new__ вместо называются пропусканием класса в качестве первого параметра, и, как ожидается, возвращает экземпляр (который впоследствии будет передан __init__).

Это позволяет, например, __new__ возвращать уже существующий экземпляр объектов, основанных на значении, которые являются неизменяемыми и для которых идентичность не должна играть роль.

+0

В какой класс вы ссылаетесь, когда говорите, что '__new__' называется передачей ** класса ** в качестве первого параметра? – HelloGoodbye

+0

@HelloGoodbye: класс объекта, который строится. Это может быть тот же класс, где вы помещаете '__new__' или класс, полученный из него (в случае, если ни производные, ни другие базы, перечисленные перед этим классом, не определяли' __new__') – 6502

0

Учитывая documentation on class customization на более подробные сведения.

В соответствии с этим эти методы используются следующим образом: __new__() для создания объекта и __init__() для его настройки.

И как 6502 заметил, __new__ является частным случаем статического метода и получает класс в качестве аргумента, а __init__ получает объект производства __new__