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