fork download
  1. class TheMeta(type):
  2. def __init__(cls, name, bases, dct):
  3. def _myInit(self, *args, **kwargs):
  4. if type(self) is cls:
  5. print "_myInit of {} {} ({})".format(name, self, id(self.__init__))
  6. cls._origInit(self, *args, **kwargs)
  7. cls._afterInit(self)
  8. else:
  9. cls._origInit(self, *args, **kwargs)
  10.  
  11. def _afterInit(self):
  12. print "Init has passed..."
  13. # Do some magic here...
  14.  
  15. cls._origInit = cls.__init__
  16. cls.__init__ = _myInit
  17. cls._afterInit = _afterInit
  18. super(TheMeta, cls).__init__(name, bases, dct)
  19.  
  20. class TheBase(object):
  21. __metaclass__ = TheMeta
  22.  
  23. class MyDerived(TheBase):
  24. def __init__(self, great=False):
  25. TheBase.__init__(self)
  26. print "MyDerived __init__ of {} ({})".format(self, id(self.__init__))
  27.  
  28. class MyDerived2(MyDerived):
  29. def __init__(self):
  30. MyDerived.__init__(self, great=True)
  31. print "MyDerived2 __init__ of {} ({})".format(self, id(self.__init__))
  32.  
  33. sd = MyDerived()
  34. d2 = MyDerived2()
Success #stdin #stdout 0.01s 8968KB
stdin
Standard input is empty
stdout
_myInit of MyDerived <__main__.MyDerived object at 0xb743180c> (3076893508)
MyDerived __init__ of <__main__.MyDerived object at 0xb743180c> (3076599932)
Init has passed...
_myInit of MyDerived2 <__main__.MyDerived2 object at 0xb74318ac> (3076893508)
MyDerived __init__ of <__main__.MyDerived2 object at 0xb74318ac> (3074621068)
MyDerived2 __init__ of <__main__.MyDerived2 object at 0xb74318ac> (3076599932)
Init has passed...