On 5/12/07, Guido van Rossum <[EMAIL PROTECTED]> wrote: > On 5/12/07, Steven Bethard <[EMAIL PROTECTED]> 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 _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com