元类一般用于建设类。在执行类界说时,表明器必需要知道这个类的正确的元类。表明器会先寻找类属性__metaclass__,假如此属性存在,就将这个属性赋值给此类作为它的元类。假如此属性没有界说,它会向上查找父类中的__metaclass__.假如还没有发明__metaclass__属性,表明器会查抄名字为__metaclass__的全局变量,假如它存在,就利用它作为元类。不然, 这个类就是一个传统类,并用 types.ClassType 作为此类的元类。
在执行类界说的时候,将查抄此类正确的(一般是默认的)元类,元类(凡是)通报三个参数(到结构器): 类名,从基类担任数据的元组,和(类的)属性字典。
元类何时被建设?
#!/usr/bin/env python print '1. Metaclass declaration' class Meta(type): def __init__(cls, name, bases, attrd): super(Meta,cls).__init__(name,bases,attrd) print '3. Create class %r' % (name) print '2. Class Foo declaration' class Foo(object): __metaclass__=Meta def __init__(self): print '*. Init class %r' %(self.__class__.__name__) # 何问起 hovertree.com print '4. Class Foo f1 instantiation' f1=Foo() print '5. Class Foo f2 instantiation' f2=Foo() print 'END' 输出
功效:
1. Metaclass declaration
2. Class Foo declaration
3. Create class 'Foo'
4. Class Foo f1 instantiation
*. Init class 'Foo'
5. Class Foo f2 instantiation
*. Init class 'Foo'
END
可见在类申明的时候,就执行了__metaclass__中的要领了,今后在界说类工具的时候,就只挪用该类的__init__()要领,MetaClass中的__init__()只在类申明的时候执行了一次。