After reading the excellent SO post, I tried crafting a module level metaclass:
def metaclass(future_class_name, future_class_parents, future_class_attrs):print "module.__metaclass__"future_class_attrs["bar"]="bar"return type(future_class_name, future_class_parents, future_class_attrs)__metaclass__=metaclassclass Foo(object):def __init__(self):print 'Foo.__init__'f=Foo()
This doesn't work (i.e. "module.metaclass" doesn't get printed) unless I remove the object
base class of Foo. How come?
NOTE: I am using Python 2.6.1.
Inheriting from object automatically brings the type metaclass along with it. This overrides your module level __metaclass__ specification.
If the metaclass is specified at the class level, then object won't override it:
def metaclass(future_class_name, future_class_parents, future_class_attrs):print "module.__metaclass__"future_class_attrs["bar"]="bar"return type(future_class_name, future_class_parents, future_class_attrs)class Foo(object):__metaclass__ = metaclassdef __init__(self):print 'Foo.__init__'f=Foo()
See http://docs.python.org/reference/datamodel.html?highlight=metaclass#customizing-class-creation