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=