Metaclass mystery
LittleGrasshopper
seattlehanks at yahoo.com
Sat May 30 19:01:06 EDT 2009
I am experimenting with metaclasses, trying to figure out how things
are put together. At the moment I am baffled by the output of the
following code:
************************************
"""
Output is:
instance of metaclass MyMeta being created
(<class '__main__.MyMeta'>, <class '__main__.MyMeta'>)
instance of metaclass MyNewMeta being created
instance of metaclass MyMeta being created <<<< Why this?
(<class '__main__.MyMeta'>, <class '__main__.MyNewMeta'>)
"""
class MyMeta(type):
def __new__(meta, classname, bases, classDict):
print 'instance of metaclass MyMeta being created'
return type.__new__(meta, classname, bases, classDict)
class MyNewMeta(type):
def __new__(meta, classname, bases, classDict):
print 'instance of metaclass MyNewMeta being created'
return type(classname, bases, classDict)
"""
Notice that a metaclass can be a factory function:
def f(classname, bases, classDict):
return type(classname, bases, classDict)
class MyClass(object):
__metaclass__ = f
"""
class MyClass(object):
__metaclass__ = MyMeta
print (MyClass.__class__, MyClass.__metaclass__)
class MySubClass(MyClass):
__metaclass__ = MyNewMeta
print (MySubClass.__class__, MySubClass.__metaclass__)
************************************
Honestly, I don't know why this line:
instance of metaclass MyMeta being created <<<< Why this?
is being output when the MySubClass class object is instantiated.
MyNewMeta's __new__ method simply instantiates type directly (which I
know shouldn't be done, but I'm just experimenting and trying to
understand the code's output.)
I would really appreciate some ideas.
More information about the Python-list
mailing list