Problemas con el __del__

Chema Cortes ch3m4 en ch3m4.org
Mar Feb 10 09:58:42 CET 2004


luis miguel morillas wrote:

> La idea está bien. Hernán te ha especificado algunas pegas de __del__
> en python (aquí las tienes ampliadas [1]). Pero además hay autores
> (Magnus Lie Hetland en Practical Python) que recomiendan evitar el
> uso de __del__ porque tú no controlas cuándo se va a destruir el objeto
> muchas veces.
> 
> Lo que quieres hacer (cerrar de forma limpia las conexiones)
> suelo hacerlo gestionando las excepciones try/except o try/finally

Supongo que quieres decir que la idea sería controlar la excepción 
'SystemExit', lanzada cuando termina, por la vía normal, la aplicación.

La forma "estándar" para colocar un "hook" en la salida "normal" es 
utilizando el módulo 'atexit':


import atexit

class MiClase:
     def __init__(self):
         soc = socket.socket()
         host = socket.gethostbyname("bla")
         port = 3001
         soc.connect((host, port))
         self.soc = soc
         print "Conectado con ", host

         atexit.register(MiClase.close,self)

     def close(self):
         self.soc.send("1000\n")
         self.soc.close()
         print "Conexion cerrada como dios manda"

     def resto_de_metodos(self):
	pass


Se debe tener en cuenta, como se comenta en otros mensejes, que aunque 
ejecutes 'del obj' siempre habrá una referencia "viva" al objeto en el 
"hook" de salida que hemos registrado con el atexit.register:

import atexit
import time

class P:
     def __init__(self):
         self.a=time.time()
         print "INIT",self.a

         atexit.register(P.close,self)

     def close(self):
         print "CLOSE",self.a

     def __del__(self):
         print "DEL", self.a

p=P()
del p


Resultado:

INIT 1076403261.45
CLOSE 1076403261.45
DEL 1076403261.45


> [1] http://www.faqs.org/faqs/python-faq/part1/ (apartado 4.17)

Actualiza tus referencias :-P

http://www.python.org/doc/faq/
http://www.python.org/doc/faq/programming.html (apartado 6.11)

-- 
Res publica non dominetur




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