-->

如何以可靠的方式使用__del__?(How to use __del__ in a reliabl

2019-07-29 04:44发布

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

如果我想以确保适当的对象清理,我应该使用一个上下文管理器 (在with语句)。

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

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

或者,我只是太天真,应该忘记__del__ ,并移动到一个完全不同的方法?

Answer 1:

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

答案是自己实现上下文管理。 一个with声明大致翻译:

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

所以只是做手工。 这是比一个稍微复杂一点,所以我建议你阅读PEP 343完全理解上下文管理器如何工作。

一种选择是打电话给你清理功能close()然后在Python的未来版本,人们可以很容易地使用contextlib.closing把它变成一个真正的上下文管理。



Answer 2:

取而代之的__del__ ,给你的类名为类似方法close ,然后调用明确:

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

为了加强安全性和向前兼容,已__exit____del__调用close为好。



文章来源: How to use __del__ in a reliable way?