Thanks for this Steven. I'm however gettings some pretty odd effects, both on method access and inheritance. I expanded your example a bit...
class Meta: def __init__(self, name, bases, namespace): self.__name__ = name self.__bases__ = bases self.__dict__ = namespace def __str__(self): return "<Meta instance>" __repr__ = __str__ def __getattr__(self, name): return "Customized " + name def __call__(self): return self class Base: def basemethod(self): return "base" class A(Base): __metaclass__ = Meta def method(self): return "answer" The effect seems to be to make all methods of A into static methods, and to ignore its base classes altogether: >>> a = A() >>> print a.blah2 Customized blah2 >>> print a.method() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: method() takes exactly 1 argument (0 given) >>> print a.method(1) answer >>> print A.method(1) answer >>> print a.basemethod() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object is not callable >>> isinstance(a, Base) False Regards, Geoff Bache -- http://mail.python.org/mailman/listinfo/python-list