如何以可靠的方式使用__del__?

时间:2012-04-27 14:26:05

标签: python destructor python-2.4

我已经了解到python does not guarantee,只要删除了一个对象,就会调用__del__。 换句话说,del x 必须调用其析构函数x.__del__()

如果我想确保正确的对象清理,我应该使用context manager(在with语句中)。

我知道这很愚蠢,但出于几个原因(请不要问为什么)我使用Python 2.4绑定了系统;因此,上下文管理器是不可能的(它们是在Python 2.5中引入的)

所以我需要一个替代解决方案,因此我的问题是:是否有最佳实践可以帮助我可靠地使用__del__?我正在考虑的方向“如果python提供了这样的功能,必须有一种方法可以有效地使用它(我只是愚蠢地弄清楚如何)”,,,

或者我只是天真,应该忘记__del__并继续采用完全不同的方法?

2 个答案:

答案 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