__new__ vs __init__

Luis Rodrigo Gallardo Cruz rodrigo en nul-unu.com
Jue Nov 15 17:26:14 CET 2007


On Thu, Nov 15, 2007 at 03:32:22AM -0300, Gabriel Genellina wrote:
> En Thu, 15 Nov 2007 01:44:31 -0300, Luis Rodrigo Gallardo Cruz 
> <rodrigo en nul-unu.com> escribió:
>
>> On Thu, Nov 15, 2007 at 12:06:38AM -0300, Gabriel Genellina wrote:
>>> En Wed, 14 Nov 2007 12:19:44 -0300, Luis Rodrigo Gallardo Cruz
>>>> En general, usar __new__ es mágia. Casi siempre es mejor evitarlo.
>>>
>>> Uh, porque? No hay nada de magia. Y no tiene que ver con que se salteen 
>>> las
>>> reglas normales o no.
>>
>> Hay magia por que alteras el comportamiento "normal". Si uno ve en el
>> código
>>
>>  var = Clase()
>>
>> uno supone que lo que está pasando es que se crea una nueva instancia
>> de Clase. Si alteras __new__ lo que pasa es lo que sea que se te
>> ocurrió poner en __new__ Si lo que se te ocurrió poner en __new__ es
>> conceptualmente similar a crear una nueva instancia y regresarla, pues
>> ni quien se de cuenta. Si no, estas escondiendo mucho comportamiento
>> en un lugar inesperado.
>
> Tal vez tus comentarios apunten al ejemplo del singleton, porque ahi sí, 
> estas cambiando el comportamiento; pero eso es propio de como funciona un 
> singleton, no del hecho de usar __new__.

Lo que digo es más bien que usar __new__ para implementar singleton
puede ser mala idea. Básicamente por que estás escondiendo el hecho de
que singleton está ahí. Sé que hay casos en que eso es precisamente lo
que quieres, pero no deja de ser cierto que hay que tener cuidado. Si
el resto de la clase hace pensar que "esto no debería ser un sigleton"
vas a confundir mucho al usuario de la clase.

Analogía mala y exagerada: En C puedes usar ensamblador embebido para
hacer muchos trucos. Eso no quiere decir que deberías usar ensamblador
embebido en cada programa. La mayoría de las veces en realidad no
necesitas el truco, o sí lo necesitas pero lo puedes hacer en C. Y en
esos casos, meter el ensamblador es meter problemas.

> Otro uso común del __new__, aparte del ejemplo de heredar de tipos 
> inmutables, sería una factoría de instancias, cuando por algun motivo 
> [no] puedo usar una funcion.
>
> [Ejemplo]

Me gusta.

Y estoy de acuerdo que es un buen caso para usar __new__, aunque,
si yo lo hubiera escrito, probablemente hubiera convertido a Handler
en un wrapper que escoje la implementación "envuelta" durante su
__init__. Cuestión de estilos, supongo.
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://mail.python.org/pipermail/python-es/attachments/20071115/bf083e95/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es