[Python-3000] PEP: Eliminate __del__

Steven Bethard steven.bethard at gmail.com
Sat May 12 21:28:54 CEST 2007


On 5/12/07, Guido van Rossum <guido at python.org> wrote:
> On 5/12/07, Steven Bethard <steven.bethard at gmail.com> wrote:
> > And here's a version that doesn't lose updates to the finalizer attributes:
> >
> >     http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/519635
> >
> > It replaces enable_finalizer() with a class attribute __finalattrs__.
> > >From __finalize__, all class attributes and methods are accessible, as
> > are any instance attributes specified by __finalattrs__. Guido's
> > BufferedWriter example looks like::
> >
> >     class BufferedWriter(Finalized):
> >         __finalattrs__ = 'buffer', 'raw'
> >         ...
> >         def flush(self):
> >             self.raw.write(self.buffer)
> >             self.buffer = b""
> >
> >         def __finalize__(self):
> >             self.flush()
>
> But can I subclass it and in the subclass override (extend) flush()? E.g.
>
> class MyWriter(BufferedWriter):
>   def flush(self):
>     super(MyWriter, self).flush()  # Or super.flush() once PEP xxx is accepted
>     print("Feel free to unplug the disk now")

Yep. The 'self' passed to __finalize__ is still an instance of the
same class (e.g. BufferedWriter or MyWriter). So inheritance works
normally:

>>> class BufferedWriter(Finalized):
...     __finalattrs__ = 'buffer', 'raw'
...     def __init__(self):
...         self.buffer = ''
...         self.raw = 'raw'
...     def flush(self):
...         print 'writing:', self.buffer, 'to', self.raw
...         self.buffer = ''
...     def __finalize__(self):
...         self.flush()
...
>>> class MyWriter(BufferedWriter):
...     def flush(self):
...         super(MyWriter, self).flush()
...         print 'feel free to unplug the disk now'
...
>>> w = MyWriter()
>>> del w
writing:  to raw
feel free to unplug the disk now

STeVe
-- 
I'm not *in*-sane. Indeed, I am so far *out* of sane that you appear a
tiny blip on the distant coast of sanity.
        --- Bucky Katt, Get Fuzzy


More information about the Python-3000 mailing list