Python如何确保在模块死之前调用对象的__del __()方法?

Ray*_*Ray 4 python destructor module

今天早些时候我问过这个问题,关于__del__()使用导入模块的对象的方法.问题是__del__()想要使用模块os,但有时(并非总是)模块已被删除.有人告诉我,当Python程序终止时,删除对象和模块的顺序可能是随机的,并且是未定义的.但是,对于我的应用程序,我确实需要确保在模块(实例化对象)之前删除对象(我创建的类的实例).有办法做到这一点吗?

mgi*_*son 10

正如我们之前告诉过你的那样,__del__当解释器退出时,你真的不应该依赖于被叫.正确执行此操作有两种选择:

首先是 atexit

import os
import atexit

class Logger(object):   
    def on_exit(self):
        print "os: %s." % os

logger = Logger()
atexit.register(logger.on_exit)
Run Code Online (Sandbox Code Playgroud)

这可确保您的记录器在退出时完成.


*更多地阅读你的问题,因为你计划将一个实例绑定到定义实例类的模块,下面的上下文管理器解决方案将不适用于此,因为没有办法留在整个上下文中执行你的程序.你需要使用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 ...
Run Code Online (Sandbox Code Playgroud)