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