I have learned that python does not guarantee that __del__
is called whenever an object is deleted.
In other words, del x
does not necessarily invoke its destructor x.__del__()
.
If I want to ensure proper object cleanup, I should use a context manager (in a with
statement).
I know it's stupid, but for a couple of reasons (please don't ask why) I am tied to a system with Python 2.4; therefore context managers are out of question (they were introduced in Python 2.5)
So I need a an alternative solution, and hence my question: are there best practices that would help me to use __del__
reliably? I am thinking in the direction of "if python provides such functionality, there must be a way it can be efficiently used (I'm just to stupid to figure out how)",,,
Or I am just being naive, should forget about __del__
and move on to a completely different approach?
In short: No, there is no way to ensure it gets called.
The answer is to implement context managers yourself. A with
statement roughly translates to:
x.__enter__()
try:
...
finally:
x.__exit__()
So just do it manually. It is a little more complex than that, so I recommend reading PEP 343 to fully understand how context managers work.
One option is to call your cleaning up function close()
, and then in future versions of python, people can easily use contextlib.closing
to turn it into a real context manager.
Instead of __del__
, give your class a method called something like close
, then call that explicitly:
foo = Foo()
try:
foo.do_interesting_stuff()
finally:
foo.close()
For extra safety and forward-compatibility, have __exit__
and __del__
call close
as well.
来源:https://stackoverflow.com/questions/10352480/how-to-use-del-in-a-reliable-way