Python ¿cómo asegurar que se llame al método __del __ () de un objeto antes de que el módulo muera?

Anteriormente, hoy hice esta pregunta sobre el __del__() de un objeto que utiliza un módulo importado. El problema fue que __del__() quiere hacer uso del módulo os , pero a veces (no siempre) el módulo ya se ha eliminado. Me dijeron que cuando un progtwig de Python termina, el orden en que se eliminan los objetos y los módulos puede ser aleatorio, y no está definido. Sin embargo, para mi aplicación, realmente necesito asegurarme de que un objeto (instancia de una clase que creé) se elimine antes de que se elimine el módulo (en el que se crea una instancia del objeto). ¿Hay alguna forma de hacer esto?

Como le dijimos antes, no debe confiar en que se __del__ a __del__ cuando salga el intérprete. Hay dos opciones para hacer esto correctamente:

El primero es atexit

 import os import atexit class Logger(object): def on_exit(self): print "os: %s." % os logger = Logger() atexit.register(logger.on_exit) 

Esto asegura que su registrador se finalice en la salida.


* Al leer un poco más sobre su problema, ya que planea tener una única instancia vinculada a un módulo que define la clase de las instancias, la solución de administrador de contexto a continuación no funcionará para esto, ya que no hay manera de permanecer en el contexto para todo el contexto. Ejecución de su progtwig. Tendrá que utilizar atexit.register . Sin embargo, desde el punto de vista del diseño del progtwig, preferiría usar un administrador de contexto para administrar mis recursos que atexit.register si la reestructuración del código lo permitiera.

La segunda (mejor *) forma de hacerlo es hacer que su clase sea un administrador de contexto que ejecute el código de limpieza al salir del contexto. Entonces su código se vería así:

 import os class Logger(object): def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): print "os:",str(os) with Logger() as logger: #do something ... 

Adjunte una referencia a la función con un parámetro de palabra clave:

 import os class Logger(object): def __del__(self, os=os): print "os: %s." %os 

o vincularlo a un atributo de clase:

 import os class Logger(object): def __init__(self): self.os = os def __del__(self): print "os: %s." % self.os 

Al crear una referencia local (suficiente), Python no buscará el sistema os como un global, sino con una referencia local, que se almacena con la instancia o con la función en sí, respectivamente.

Los globales se consultan en tiempo de ejecución (por lo que la función __del__ en su otra pregunta falla si ya se ha limpiado os ), mientras que una función local se borra junto con el objeto de función, o en el caso de un atributo de instancia, ejemplo.