我已经了解到python does not guarantee,只要删除了一个对象,就会调用__del__
。
换句话说,del x
不必须调用其析构函数x.__del__()
。
如果我想确保正确的对象清理,我应该使用context manager(在with
语句中)。
我知道这很愚蠢,但出于几个原因(请不要问为什么)我使用Python 2.4绑定了系统;因此,上下文管理器是不可能的(它们是在Python 2.5中引入的)
所以我需要一个替代解决方案,因此我的问题是:是否有最佳实践可以帮助我可靠地使用__del__
?我正在考虑的方向“如果python提供了这样的功能,必须有一种方法可以有效地使用它(我只是愚蠢地弄清楚如何)”,,,
或者我只是天真,应该忘记__del__
并继续采用完全不同的方法?
答案 0 :(得分:8)
简而言之:不,没有办法确保它被调用。
答案是自己实现上下文管理器。 with
语句大致翻译为:
x.__enter__()
try:
...
finally:
x.__exit__()
所以只需手动完成。它比这复杂一点,所以我建议阅读PEP 343以完全理解上下文管理器的工作方式。
一个选项是调用清理函数close()
,然后在未来的python版本中,人们可以轻松地使用contextlib.closing
将其转换为真实的上下文管理器。
答案 1 :(得分:5)
而不是__del__
,为您的班级提供一个名为close
的方法,然后明确地调用它:
foo = Foo()
try:
foo.do_interesting_stuff()
finally:
foo.close()
为了提高安全性和向前兼容性,请__exit__
和__del__
拨打close
。