having a function called after the constructor/__init__ is done

Michael Spencer mahs at telcopartners.com
Tue Mar 17 05:02:13 CET 2009


thomas.hansen at 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




More information about the Python-list mailing list