6

我了解到,python 保证 在删除对象时调用它__del__换句话说,不一定del x 调用的析构函数x.__del__()

如果我想确保正确清理对象,我应该使用上下文管理器(在with语句中)。

我知道这很愚蠢,但出于几个原因(请不要问为什么),我与 Python 2.4 的系统相关联;因此上下文管理器是没有问题的(它们是在 Python 2.5 中引入的)

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

或者我只是天真,应该忘记__del__并转向完全不同的方法吗?

4

2 回答 2

8

简而言之:不,没有办法确保它被调用。

答案是自己实现上下文管理器。一个with语句大致翻译为:

x.__enter__()
try:
    ...
finally:
    x.__exit__()

所以只需手动完成。它比这复杂一点,所以我建议阅读PEP 343以充分了解上下文管理器的工作原理。

一种选择是调用你的清理函数close(),然后在 python 的未来版本中,人们可以很容易地contextlib.closing将它变成一个真正的上下文管理器。

于 2012-04-27T14:27:52.870 回答
5

而不是__del__,给你的类一个名为类似的方法close,然后显式调用它:

foo = Foo()
try:
    foo.do_interesting_stuff()
finally:
    foo.close()

为了获得额外的安全性和前向兼容性,也可以使用 have__exit____del__call close

于 2012-04-27T14:31:20.270 回答