python - 无法在 __del__() 中引用导入的模块

标签 python import del

我正在使用对象的 __del__() 取消订阅事件(使用类似于 this 的事件方案):

import my_enviroment
class MyClass():
    def __del__(self):
        my_environment.events.my_event -= self.event_handler_func

奇怪的是,我在程序运行结束时收到以下错误:

Exception AttributeError: "'NoneType' object has no attribute 'events'" in <bound method MyClass.__del__ of <myclass.MyClass instance at 0x04C54580>> ignored

这怎么可能?! my_environment 是我导入的模块,怎么会是None呢? (events是一个全局对象,里面有my_event等事件钩子(Hook))

最佳答案

根据python doc about __del__ :

[...] other globals referenced by the __del__() method may already have been deleted or in the process of being torn down (e.g. the import machinery shutting down). For this reason, __del__() methods should do the absolute minimum needed to maintain external invariants.

换句话说,当你的对象调用__del__方法时,my_enviroment可能已经被python“删除”了,所以它可以是None...

关于python - 无法在 __del__() 中引用导入的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8590238/

相关文章:

python - 将数据框转换为另一个数据框,将复合字符串单元格拆分为单独的行

python - 无法在 OSX El Capitan (opencv3.1.0) 上的 python2.7 中导入 cv2

python - 来自 Python 中的导入语句

javascript - gulp 在 gulp-load-plugins 错误中加载其他模式

类上的 Python del

python - 为什么要删除文件末尾的导入?

c++ - 从使用 numpy.save(...) 保存的文件中将 numpy 数组加载到 C 中

java - Py4j 在服务器中运行应用程序时出现异常

import - 如何使用 tslint 的导入排序规则对导入进行排序

python - 控制 python 导入以减少大小和开销