having a function called after the constructor/__init__ is done

thomas.hansen at gmail.com thomas.hansen at gmail.com
Mon Mar 16 23:11:18 EDT 2009


Hi all,

We've been breaking our heads over a good way of accomplishing an
"on_load" event in our multitouch GUI frameowork PyMT.  We think we'd
like to trigger an "on_load" event after a class is fully instantiated
(or just a function call for simplicity, so you dont need to worry
about our specific system).  This is so that if I make a subclass of
some widget, I dont have to overwrite the __init__ method (use super,
know the args, and pass them) everytime.  Maybe I just want to do some
really basic stuff that doesn't really have anything to do with the
parent class.

Anyway.  My first attempt was to simply put a call to self.on_load at
the end of the widget base class.  This doesn't work though, because,
if I subclass it and do things after the call to super.__init__,
on_load will be called before the constructor finishes (when the top
most parent class __init__ finishes)

We've sort of managed to achieve this by using a decorator that
changes the __init__ function.  but even this doesnt seem like the
best way to do this.  a) I now have to decorate every constructor i
ever write. b) it seems impossible to make it so that it only happens
once after the object is actually instantiated (since i have a
decorator on all my constructors..each constructor in the inheritance
line will call on_load once)

Can I do something fancy with metaclasses here?  I think I could kind
of do this by making all my classes use __new__, and then essentially
use __init__ as what i want on_load to be...but that just seems really
nasty and unpythonic.  not to speak about the confusion it would cause
with people trying to figure out the library.

So any ideas on how to get a function called on an object just after
__init__ is done executing?



More information about the Python-list mailing list