Я слышал, что __init__ функция в Python не конструктор, Это Initializer и на самом деле функция __new__ является Constructor, а разница в том, что функция __init__ вызывается после того, как создание объекта и вызов __new__. Я прав? Можете ли вы объяснить разницу лучше и зачем нам нужны и __new__ и __init__?Python - Initializer против Конструктора
ответ
В сущности, __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 (однако, это хорошая техника или нет, однако, это не так).
К лучшему или к худшему, вы в основном получаете возможность контролировать процесс создания экземпляра, и что бы это ни значило в вашей конкретной ситуации.
__init__
вызывается с уже созданным экземпляром объекта в качестве первого параметра (обычно это называется self
, но это просто имя параметра).
__new__
вместо называются пропусканием класса в качестве первого параметра, и, как ожидается, возвращает экземпляр (который впоследствии будет передан __init__
).
Это позволяет, например, __new__
возвращать уже существующий экземпляр объектов, основанных на значении, которые являются неизменяемыми и для которых идентичность не должна играть роль.
В какой класс вы ссылаетесь, когда говорите, что '__new__' называется передачей ** класса ** в качестве первого параметра? – HelloGoodbye
@HelloGoodbye: класс объекта, который строится. Это может быть тот же класс, где вы помещаете '__new__' или класс, полученный из него (в случае, если ни производные, ни другие базы, перечисленные перед этим классом, не определяли' __new__') – 6502
Учитывая documentation on class customization на более подробные сведения.
В соответствии с этим эти методы используются следующим образом: __new__()
для создания объекта и __init__()
для его настройки.
И как 6502 заметил, __new__
является частным случаем статического метода и получает класс в качестве аргумента, а __init__
получает объект производства __new__
Проверить эту ссылку: http://stackoverflow.com/questions/674304/ pythons-use-of-new-and-init – Vinkal
'__init__' * - это прямой эквивалент тому, что другие языки OO (особенно Java и C++) имеют тенденцию вызывать« конструктор ».AFAIK эти языки на самом деле не имеют * никакого прямого эквивалента '__new__'. Но, вероятно, именно потому, что эквивалент «конструктора» на самом деле ничего не создает (а также не конструкторы C++ или Java), Python имеет тенденцию ссылаться на них как на имена реальных методов, а не называть * либо * «конструктором». – lvc