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

标签 python module destructor

今天早些时候我问了this关于使用导入模块的对象的 __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)

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


*更多地了解您的问题,因为您计划将单个实例绑定(bind)到定义实例类的模块,下面的上下文管理器解决方案将无法解决这个问题,因为无法留在上下文中用于整个程序的执行。您需要使用 atexit.register。但是,从程序设计的角度来看,如果重构代码允许的话,我更愿意使用上下文管理器来管理我的资源而不是 atexit.register

第二种(better*)方法是让你的类成为context manager当您退出上下文时执行清理代码。那么您的代码将如下所示:

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 ...

关于Python如何确保在模块死亡之前调用对象的 __del__() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14986568/

相关文章:

python - python 函数不返回任何内容

python - 如何在 Python 3 中用前导零填充字符串

python - Selenium headless ChromeDriver 失败并出现 ConnectionResetError : [Errno 104] Connection reset by peer

java - 函数何时应该调用另一个函数以及何时使用方法依赖注入(inject)

c++ - 将 <vector <vector<DataClass>> 解除分配为类成员

python - 使用 python 从文本中获取个人和组织名称的方法

javascript - 导出并要求 Express 应用程序问题

javascript - Webpack 使用 Emscripten 抛出错误 : Can't resolve 'fs'

python - 如何调试未调用的 __del__()

c++ - 无法解释编译器的行为