agregar un campo a object - ex [id de objetos]

Gabriel Genellina gagsl-py2 en yahoo.com.ar
Sab Mayo 3 02:51:38 CEST 2008


En Wed, 30 Apr 2008 23:07:14 -0300, Chema Cortes <py en ch3m4.org> escribió:

> El Thursday 01 May 2008 01:02:27 Milton Galo Patricio Inostroza Aguilera
> escribió:
>> Estimados:
>>
>> * Cada objeto que se cree deberá tener un identificador único dentro
>> del programa
>>

[... respuesta de Chema Cortes con la que estoy totalmente de acuerdo ...]

> Por otro lado, el object.c define la base de las nuevas clases, las que
> unifican tipos y clases. Aún existen las viejas clases, que van por otro
> lado:
>
> class P:
>   pass
>
> issubclass(P,object) --> False

Las clases viejas no *heredan* de object, pero igualmente son *instancias*  
de object como todo objeto en Python.

py> isinstance(P, object)
True

Asi que en principio, para hacer lo que Milton quiere (y no estoy diciendo  
que sea una buena idea...) se le puede agregar un campo nuevo a PyObject  
(en object.h; probablemente en _PyObject_HEAD_EXTRA y  
_PyObject_EXTRA_INIT), modificar _PyObject_New y alrededores, recompilar  
Python, y rogar que todo siga funcionando :)

> No sabría cómo concretar mi ayuda. Aún así se me ocurren un par de cosas:
>
> - considera las listas de igual modo que el paso de variables por  
> referencia,
> no como a objetos normales (eg: similar al Object& de C++)
>
> - guarda siempre una referencia a todo objeto, de este modo podrás seguir
> usando el id() sin riesgo a que se repita (a costa de requerir más  
> memoria).

No sirve porque cambia el comportamiento del programa. Aun cuando uno "no  
deberia" depender de eso, hay mucho codigo que asume que los objetos  
locales desaparecen ni bien se van de ámbito, por poner un ejemplo. O  
aunque sea, que "eventualmente" los objetos se destruyen. Y eso ya no  
pasaría mas.

> Es más, ¿por qué no desactivas totalmente el recolector de basura  
> durante el
> depurado? (gc.disable()). No hace falta que te advierta de la cantidad de
> memoria que vas a necesitar.

Tampoco sirve de mucho. Todos los objetos se destruyen ni bien se libera  
su ultima referencia; el gc sólo busca ciclos de referencias entre objetos  
que no esten referenciados desde fuera del propio ciclo (y entonces  
simplemente libera una de las referencias; eso provoca una liberacion en  
cascada del ciclo completo). Pero no es realmente el gc quien destruye los  
objetos.

py> class X:
...   def __del__(self): print "destruyendo", self
...
py> x = X()
py> del x
destruyendo <__main__.X instance at 0x00A3BE90>
py> import gc
py> gc.disable()
py> x = X()
py> del x
destruyendo <__main__.X instance at 0x00B19788>

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