nicolas@sky ~/Tmp $ cat cm.py def bar(self): return 'foo' class MetaClass(type): def __new__(cls, name, bases, attrs): if name == 'FirstClass': return super(MetaClass, cls).__new__(cls, name, bases, attrs) new_class = type.__new__(cls, name, bases, {}) print 'Registered %s' % name new_class.foo() return new_class class FirstClass(object): __metaclass__ = MetaClass def foo(cls): setattr(cls, 'bar', bar) print 'foo1 done' foo = classmethod(foo) class SecondClass(FirstClass): def foo(cls): super(SecondClass, cls).foo() setattr(cls, 'baz', 'baz') print 'foo2 done' foo = classmethod(foo) nicolas@sky ~/Tmp $ python cm.py Registered SecondClass foo1 done