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

E.Z*_*.Z. 6 python destructor python-2.4

我了解到,蟒蛇 没有 保证的是__del__当一个对象被删除时调用.换句话说,del x 并不一定调用析构函数x.__del__().

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

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

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

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

Gar*_*tty 8

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

答案是自己实现上下文管理器.一个with说法大致翻译:

x.__enter__()
try:
    ...
finally:
    x.__exit__()
Run Code Online (Sandbox Code Playgroud)

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

一种选择是调用清理功能close(),然后在未来版本的python中,人们可以轻松contextlib.closing地将其转换为真正的上下文管理器.


Fre*_*Foo 5

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

foo = Foo()
try:
    foo.do_interesting_stuff()
finally:
    foo.close()
Run Code Online (Sandbox Code Playgroud)

为了额外的安全性和前向兼容性,请拥有__exit____del__致电close.