我了解到,蟒蛇并 没有 保证说__del__
当一个对象被删除时调用。 换句话说, del x
不必 调用析构函数x.__del__()
如果我想以确保适当的对象清理,我应该使用一个上下文管理器 (在with
语句)。
我知道这是愚蠢的,但有两个原因(请不要问为什么)我绑与Python 2.4的系统; 因此上下文管理器被出题(它们在Python 2.5引入)
所以我需要一个替代的解决方案,因此,我的问题:是否存在,这将有助于我使用的最佳实践__del__
可靠? 我在的方向思考,“如果Python提供了这样的功能,必须有可以有效使用的方式(我只是愚蠢弄清楚如何)” ,,,
或者,我只是太天真,应该忘记__del__
,并移动到一个完全不同的方法?
简而言之:没有,没有办法,以确保它被调用。
答案是自己实现上下文管理。 一个with
声明大致翻译:
x.__enter__()
try:
...
finally:
x.__exit__()
所以只是做手工。 这是比一个稍微复杂一点,所以我建议你阅读PEP 343完全理解上下文管理器如何工作。
一种选择是打电话给你清理功能close()
然后在Python的未来版本,人们可以很容易地使用contextlib.closing
把它变成一个真正的上下文管理。
取而代之的__del__
,给你的类名为类似方法close
,然后调用明确:
foo = Foo()
try:
foo.do_interesting_stuff()
finally:
foo.close()
为了加强安全性和向前兼容,已__exit__
和__del__
调用close
为好。