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()