[Python-es] __new__ vs __init__
Chema Cortes
py en ch3m4.org
Jue Nov 15 05:03:11 CET 2007
El Wednesday 14 November 2007 15:58:20 tny escribió:
> Sé que __new__ es llamado antes de que se cree el objeto, y es el
> encargado de crearlo y devolverlo.
>
> Sé que __init__ es llamado después de __new__ para inicializarlo.
>
> Yo de momento nunca he necesitado usar __new__ porque para lo que hago
> __init__ me basta.
>
> El caso es que me han comentado que el código que genera tepache invita
> a inicializar los widgets en el __new__, y yo considero que debe ir en
> __init__
>
> ¿Cuándo se debería emplear __init__ y cuando __new__?
__init__ es un inicializador
__new__ es un creador/constructor (patrón "Factoría")
Independientemente de lo que en otros lenguajes se entiede por "constructor",
lo importante es saber que __new__ es invocado antes de crear la instancia e
__init__ después. Hay propiedades del objeto que sólo son posible cambiar
desde __new__ como, por ejemplo, el tipo de dato, la herencia, etc.
En general, es una mala idea influir en la creación de la instancia: __init__
es mucho más seguro siempre. Aún así, existen dos motivos por los que se
justificaría inicializar un objeto en __new__ en lugar de en __init__:
- La clase deriva de un tipo inmutable (eg: tupla, string,...). El objeto no
se puede alterar una vez creado; pero siempre podremos alterar su valor antes
de su creación.
- La instancia creada en __new__ tiene un tipo distinto a la clase
(isinstance(obj,class)==False). En este caso no se invocará automáticamente
el método __init__ como es habitual, por lo que se hace obligado inicializar
la instancia dentro de __new__, después de crear el objeto.
Más información sobre la lista de distribución Python-es