3

我想在一个类中使用 ConfigParser,它需要来自析构函数的调用,但随后发生了奇怪的事情。

这是我的代码:

"""
function name is 
test  ok!
test1 failed!
test2 failed!
test3 failed!

test4
...  ok!

"""

def test3():
  pass

class Class1:
  def __del__(self):
    test3()

if __name__=="__main__":
  obj=Class1()

如果函数名为test1, test2or test3,则会引发异常,我无法通过try except.

回溯是:

E:\tc.py
Exception TypeError: "'NoneType' object is not callable" in <bound method Class1.__del__ of <__main__.Class1 instance at 0x00C18F58>> ignored

太奇怪了!你能在你的系统中测试它吗?还是我做错了什么?

4

2 回答 2

10

对象被销毁的顺序是不确定的。这意味着在obj.__del__()被调用时——如果它被调用——test3()可能已经被销毁,也可能没有被销毁。

文档中有一个带有警告的红色框:

警告由于__del__()调用方法的环境不稳定,因此在执行期间发生的异常将被忽略,sys.stderr而是打印一个警告。此外,当__del__()响应于模块被删除而被调用时(例如,当程序执行完成时),该__del__()方法引用的其他全局变量可能已经被删除或正在被拆除(例如,导入机器关闭) . 为此原因,__del__()方法应该做维护外部不变量所需的绝对最小值。从 1.5 版开始,Python 保证名称以下划线开头的全局变量会在其他全局变量被删除之前从其模块中删除;__del__()如果不存在对此类全局变量的其他引用,这可能有助于确保在调用方法时导入的模块仍然可用。

在 Python 中,几乎从不覆盖__del__. 您可能应该重新考虑您的设计。请参阅如何正确清理 Python 对象?

于 2012-05-30T07:22:36.080 回答
4

你不能确定在调用test3的时候还没有被销毁obj.__del__()Class1.__init__()如果您需要保留它,请添加对它的引用。

于 2012-05-30T07:21:43.343 回答