__new__ vs __init__

Gabriel Genellina gagsl-py2 en yahoo.com.ar
Jue Nov 15 04:31:01 CET 2007


En Wed, 14 Nov 2007 13:17:08 -0300, Xin <xinxic en gmail.com> escribió:

> Yo lo he tenido que utilitzar.
> Antes de saber que existia perdí muchas horas.
>
> La classe que tenia que usar heredaba de "long" i se encargaba de  
> analizar un flujo de bits (enormes), de forma que podia extraer una  
> cierta cantidad de bits como si fuera otro flujo. Esto me servia para  
> analizar dichos datos en trozos.

Hasta aca vamos bien.

> La idea principal és que si heredas de qualquier tipo de dato primitivo,  
> esos datos que siempre tienen el mismo id, debe usar-se __new__

Mmm, no.

> Puedes saber si és un tipo primitivo si mantiene el mismo "id".
>  >>> i = 5
>  >>> f = 5.
>  >>> l = 5L
>  >>> t = '5'
>  >>> id(5) == id(i)
> True
>  >>> id(5.) == id(f)
> False
>  >>> id(5L) == id(l)
> False
>  >>> id('5') == id(t)
> True
>
> Cachis, ahora el long i el float no me dan el mismo id.
> Eso no puede ser !!!

Hay que usar __new__ para los tipos INMUTABLES, porque en ese caso  
__init__ no es invocado nunca. Son inmutables int, long, float, str,  
unicode, tuple, frozenset...

Que mantenga o no el mismo id es una cuestion de optimizacion del  
intérprete:

py> x=30
py> y=30
py> id(x)
10048916
py> id(y)
10048916

pero:

py> x=10000
py> y=10000
py> id(x)
10903980
py> id(y)
10903776

Para los tipos mutables, si creas dos instancias iguales, *seguro* que  
tienen que ser objetos separados (con dos id diferentes) porque siendo  
mutables se tienen que poder modificar independientemente.
Para los tipos inmutables, cuando creas dos instancias iguales, Python  
*podría* devolverte las dos veces el mismo objeto porque nunca van a  
cambiar, pero tambien *podria* devolverte dos objetos separados. Devolver  
el *mismo* objeto es una optimizacion nada mas, y se hace (en CPython)  
para los enteros chicos, las strings muy cortas, las expresiones  
regulares, y alguna que otra cosa por ahi.

-- 
Gabriel Genellina

------------ 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