__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