2010-08-27 9 views
8

Duplicar posibles:
Python's use of __new__ and __init__ ?__new__ primer orden y __init__ en Python

La manera en que yo entiendo, __init__ es diferente de un constructor en Java, porque __init__ sólo se inicializa un objeto que tiene ya se ha construido implícitamente (porque __init__ se llama después de __new__). Sin embargo, todo lo que alguna vez he necesitado definir ha usado esta última propiedad de un 'constructor' en Java. ¿Cuál sería el caso en que un programador quisiera anular __new__?

EDITAR: Para el registro, te pido en parte porque me pregunto cuál sería la ventaja/desventaja de anulando nueva vs utilizando un classmethod separada en la respuesta aceptada a esta pregunta:

Moving Beyond Factories in Python

+0

No es exactamente un duplicado exacto en mis ojos – abyx

Respuesta

11

__new__ sucede realmente antes de que exista un objeto. Es un método estático del tipo. Los usos de __new__ se producen cuando desea controlar la creación de objetos nuevos, p. un singleton. Si su __new__ siempre devuelve la misma instancia de un objeto, es un singleton. No puedes hacer eso con __init__.

En general, en "Python como Guido pretende que sea" no se debe utilizar __new__ más de una vez al mes :)

+0

Eso tiene sentido. Entonces, ¿es esto (la respuesta aceptada a continuación) un caso en el que reemplazar __new__ también sería apropiado? http://stackoverflow.com/questions/3571773/moving-beyond-factories-in-python – chimeracoder

+0

@thebackhand parece que – abyx

3

__new__ es para la creación de nueva instancia de objeto, __init__ es para inicializarlo.

Creo que si diseñas un tipo inmutable, debes inicializarlo en __new__, ver namedtuple por ejemplo (también Python's use of __new__ and __init__?).

Cuestiones relacionadas