thomas.han...@gmail.com wrote:
...

So any ideas on how to get a function called on an object just after
__init__ is done executing?
--
http://mail.python.org/mailman/listinfo/python-list


Yes, you *can* use metaclasses - you need to override the type.__call__ method, which is what normally calls __new__ then __init__:

 >>> class MetaOnLoad(type):
 ...     def __call__(cls, *args, **kw):
 ...         obj=type.__call__(cls, *args, **kw)
 ...         obj.on_load()
 ...         return obj
 ...
 >>> class A(object):
 ...     __metaclass__ = MetaOnLoad
 ...     def __init__(self):
 ...         print "__init__ A"
 ...     def on_load(self):
 ...         print "on_load"
 ...
 >>> class B(A):
 ...     def __init__(self):
 ...         super(B,self).__init__()
 ...         print "__init__ B"
 ...
 >>> b=B()
 __init__ A
 __init__ B
 on_load
 >>> class C(B):
 ...     def __init__(self):
 ...         super(C,self).__init__()
 ...         print "__init__ C"
 ...
 >>> c=C()
 __init__ A
 __init__ B
 __init__ C
 on_load
 >>> #Check that __new__ machinery is still available:
 >>> class D(C):
 ...     def __new__(cls,*args, **kw):
 ...         obj = object.__new__(cls, *args, **kw)
 ...         print "__new__ D"
 ...         return obj
 ...
 >>> d=D()
 __new__ D
 __init__ A
 __init__ B
 __init__ C
 on_load
 >>>

HTH
Michael

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to