metaclass的原理其实是这样的:当定义好类之后,创建类的时候其实是调用了type的__new__方法为这个类分配内存空间,创建好了之后再调用type的__init__方法初始化(做一些赋值等)。所以metaclass的所有magic其实就在于这个__new__方法里面了。
说说这个方法:__new__(cls, name, bases, attrs)
cls: 将要创建的类,类似与self,但是self指向的是instance,而这里cls指向的是class
name: 类的名字,也就是我们通常用类名.__name__获取的。
bases: 基类
attrs: 属性的dict。dict的内容可以是变量(类属性),也可以是函数(类方法)。
看一个简单例子:
from time import ctime class MetaC(type): def __init__(cls,name,bases,attrd): super(MetaC,cls).__init__(name,bases,attrd); print "created class %r at %s" % (name,ctime()); class Foo(object): __metaclass__=MetaC def __init__(self): print "instanitiated class %r at :%s" % (self.__class__.__name__,ctime()); f=Foo();
其中MetaC的init方法其实调用的是:
class type(object) type(object) -> the object's type type(name, bases, dict) -> a new type
这里的第二个方法。