无法在任何类中调用析构函数

时间:2012-05-30 07:18:58

标签: python

我想在一个类中使用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()

如果该功能名为test1test2test3,则会引发异常,我无法通过try except抓住它。

追溯是:

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

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

2 个答案:

答案 0 :(得分:9)

未定义对象的销毁顺序。这意味着,当obj.__del__()被调用时 - 如果它被调用 - test3()可能已经或可能没有被销毁。

documentation中有一个带警告的红框:

  

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

在Python中,几乎永远不会覆盖__del__。您应该重新考虑您的设计。见How do I correctly clean up a Python object?

答案 1 :(得分:3)

您无法确定在调用test3obj.__del__()尚未被销毁。如果您需要保留它,请在Class1.__init__()中添加对它的引用。