import functools class Namespace(object): def __init__(self): self.__insts = {} def _bind_class(self, name, bases, dict): cls = type(name, bases, dict) cls.__ns = self def __init__(slf, *args, **kwargs): self.__insts[id(slf)] = slf cls.__init__(*args, **kwargs) print cls.__init__ cls.__init__ = __init__ return cls def __call__(self, func): result = func if not func.__name__.startswith('_'): setattr(self, func.__name__, func) result = None return result def __getattribute__(self, name): result = object.__getattribute__(self, name) if callable(result): result=functools.partial(result, self.__inst) return result class NamespacedClass(object): a = Namespace() __metaclass__ = a._bind_class @a def b(self, test_arg): print self, test_arg