[Python-3000] PEP: Eliminate __del__

Guido van Rossum guido at python.org
Fri May 4 19:15:19 CEST 2007

On 5/4/07, Raymond Hettinger <python at rcn.com> wrote:
> An encapsulating function should be added to the weakref module
> so that Guido's example could be written as:
> class BufferedWriter:
>   def __init__(self, raw):
>     self.raw = raw
>     self.buffer = ""
>     weakref.cleanup(self, lambda s: s.raw.write(s.buffer))

Or, instead of a new lambda, just use the unbound method:

    weakref.cleanup(self, self.__class__.flush)

Important: use the dynamic class (self.__class___), not the static
class (BufferedWriter). The distinction matters when BufferedWriter is
subclassed and the subclass overrides flush().

Hm, a thought just occurred to me. Why not arrange for object.__new__
to call [the moral equivalent of] weakref.cleanup(self,
self.__class__.__del__), and get rid of the direct call to __del__
from the destructor? (And the special-casing of objects with __del__
in the GC module, of course.)

Then classes that define __del__ won't have to be changed at all. (Of
course dynamically patching a different __del__ method into the class
won't have quite exactly the same semantics, but I don't really care
about such a fragile and rare possibility; I care about vanilla use of
__del__ methods.)

--Guido van Rossum (home page: http://www.python.org/~guido/)

More information about the Python-3000 mailing list