class TheMeta( type ) :
def __init__ ( cls, name, bases, dct) :
def _myInit( self , *args, **kwargs) :
if type ( self ) is cls:
print "_myInit of {} {} ({})" .format ( name, self , id ( self .__init__ ) )
cls._origInit( self , *args, **kwargs)
cls._afterInit( self )
else :
cls._origInit( self , *args, **kwargs)
def _afterInit( self ) :
print "Init has passed..."
# Do some magic here...
cls._origInit = cls.__init__
cls.__init__ = _myInit
cls._afterInit = _afterInit
super ( TheMeta, cls) .__init__ ( name, bases, dct)
class TheBase( object ) :
__metaclass__ = TheMeta
class MyDerived( TheBase) :
def __init__ ( self , great= False ) :
TheBase.__init__ ( self )
print "MyDerived __init__ of {} ({})" .format ( self , id ( self .__init__ ) )
class MyDerived2( MyDerived) :
def __init__ ( self ) :
MyDerived.__init__ ( self , great= True )
print "MyDerived2 __init__ of {} ({})" .format ( self , id ( self .__init__ ) )
sd = MyDerived( )
d2 = MyDerived2( )
Y2xhc3MgVGhlTWV0YSh0eXBlKToKICAgIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkY3QpOgogICAgICAgIGRlZiBfbXlJbml0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZikgaXMgY2xzOgogICAgICAgICAgICAgICAgcHJpbnQgIl9teUluaXQgb2Yge30ge30gKHt9KSIuZm9ybWF0KG5hbWUsIHNlbGYsIGlkKHNlbGYuX19pbml0X18pKQogICAgICAgICAgICAgICAgY2xzLl9vcmlnSW5pdChzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgICAgICBjbHMuX2FmdGVySW5pdChzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY2xzLl9vcmlnSW5pdChzZWxmLCAqYXJncywgKiprd2FyZ3MpCgogICAgICAgIGRlZiBfYWZ0ZXJJbml0KHNlbGYpOgogICAgICAgICAgICBwcmludCAiSW5pdCBoYXMgcGFzc2VkLi4uIgogICAgICAgICAgICAjIERvIHNvbWUgbWFnaWMgaGVyZS4uLgoKICAgICAgICBjbHMuX29yaWdJbml0ID0gY2xzLl9faW5pdF9fCiAgICAgICAgY2xzLl9faW5pdF9fID0gX215SW5pdAogICAgICAgIGNscy5fYWZ0ZXJJbml0ID0gX2FmdGVySW5pdAogICAgICAgIHN1cGVyKFRoZU1ldGEsIGNscykuX19pbml0X18obmFtZSwgYmFzZXMsIGRjdCkKCmNsYXNzIFRoZUJhc2Uob2JqZWN0KToKICAgIF9fbWV0YWNsYXNzX18gPSBUaGVNZXRhCgpjbGFzcyBNeURlcml2ZWQoVGhlQmFzZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JlYXQ9RmFsc2UpOgogICAgICAgIFRoZUJhc2UuX19pbml0X18oc2VsZikKICAgICAgICBwcmludCAiTXlEZXJpdmVkIF9faW5pdF9fIG9mIHt9ICh7fSkiLmZvcm1hdChzZWxmLCBpZChzZWxmLl9faW5pdF9fKSkKCmNsYXNzIE15RGVyaXZlZDIoTXlEZXJpdmVkKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBNeURlcml2ZWQuX19pbml0X18oc2VsZiwgZ3JlYXQ9VHJ1ZSkKICAgICAgICBwcmludCAiTXlEZXJpdmVkMiBfX2luaXRfXyBvZiB7fSAoe30pIi5mb3JtYXQoc2VsZiwgaWQoc2VsZi5fX2luaXRfXykpCiAgICAgICAgCnNkID0gTXlEZXJpdmVkKCkKZDIgPSBNeURlcml2ZWQyKCk=