Python如何确保在模块死亡之前调用对象的__del __()方法?
问题内容:
今天早些时候,我问了一个有关__del__()
使用导入模块的对象的方法的问题。问题是__del__()
想要使用该模块os
,但是有时(并非总是)该模块已被删除。有人告诉我,当Python程序终止时,删除对象和模块的顺序可以是随机的,并且是不确定的。但是,对于我的应用程序,我确实需要确保在删除模块(实例化该对象的模块)之前先删除一个对象(创建的类的实例)。有办法吗?
问题答案:
正如我们之前告诉您的那样,__del__
当解释器退出时,您确实不应依赖于被调用。有两种方法可以正确执行此操作:
首先是 atexit
import os
import atexit
class Logger(object):
def on_exit(self):
print "os: %s." % os
logger = Logger()
atexit.register(logger.on_exit)
这样可以确保记录器在退出时完成。
*多读一些问题,因为您打算将单个实例绑定到定义实例类的模块,所以下面的上下文管理器解决方案对此不起作用,因为无法将整个实例留在上下文中执行程序。您需要使用atexit.register
。但是,从程序设计的角度来看,与atexit.register
重组代码允许的情况相比,我更希望使用上下文管理器来管理我的资源。
第二种 (更好的*)
方法是使您的类成为上下文管理器,该管理器在退出上下文时执行清除代码。然后您的代码将如下所示:
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 ...