我想在一个类中使用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
,test2
或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
太奇怪了!你能在你的系统中测试它吗?或者我做错了什么?
答案 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)
您无法确定在调用test3
时obj.__del__()
尚未被销毁。如果您需要保留它,请在Class1.__init__()
中添加对它的引用。