无法在__del __()中引用导入的模块

Jon*_*han 5 python import del

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

import my_enviroment
class MyClass():
    def __del__(self):
        my_environment.events.my_event -= self.event_handler_func
Run Code Online (Sandbox Code Playgroud)

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

Exception AttributeError: "'NoneType' object has no attribute 'events'" in <bound method MyClass.__del__ of <myclass.MyClass instance at 0x04C54580>> ignored
Run Code Online (Sandbox Code Playgroud)

怎么可能这样?!my_environment是我导入的模块,怎么可能是None?(events是一个带有事件挂钩的全局对象,例如my_event)

Céd*_*ien 7

根据python doc关于__del__:

[...]该__del__()方法引用的其他全局变量可能已被删除或正在被拆除(例如导入机器关闭).因此,__del__()方法应该做到维持外部不变量所需的绝对最小值.

换句话说,当__del__你的对象调用该方法时,my_enviroment可能已被python"删除",因此它可以是None ...