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__=metaclass
class 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.
The specification specifies the order in which Python will look for a metaclass:
You will see from the above that having a base class at all (whatever the base class is, even if it does not ultimately inherit from
object
) pre-empts the module-level__metaclass__
.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:
See http://docs.python.org/reference/datamodel.html?highlight=metaclass#customizing-class-creation