元类(metaclass)是用来创建类的类,type是pyhon种内建的元类type(object):返回一个对象的类型,与object.__class__的值相同,type(name,bases,dict):创建一个新的type类型,name就是新class的name,值存到__name__属性中,bases是tuple类型,值会存到__bases__中,dict的值存到__dict__中type exampleclassX:
... a = 1
...
X = type('X', (object,), dict(a=1))
类默认是用type()创建的,通过定义类时指定metaclass参数或继承自某个类,而该类指定了metaclass参数,可以自定义类的创建过程
metaclass exampleclassOrderedClass(type):
#该方法返回值就是__new__的namespace参数,如果没有该方法namespace的值就是dict()
@classmethoddef__PRepare__(metacls,name, bases, **kwds):returncollections.OrderedDict()
#namespace就是class的__dict__,这个dict类型的对象已经被填充了相应的值def__new__(cls,name, bases, namespace, **kwds):
result = type.__new__(cls,name, bases, dict(namespace))
result.members = tuple(namespace)returnresultclassA(metaclass=OrderedClass):defone(self): passdeftwo(self): passdefthree(self): passdeffour(self): passprint(A.members)
#('__module__', '__qualname__', 'one', 'two', 'three', 'four')
确定一个类的metaclass的步骤:如果没有基类也没有显示指定metaclass,那么使用type()如果显示指定了metaclass,并且metaclass不是type()的实例,那么直接使用metaclass如果类的metaclass被显示指定为type()类型的实例,或者有继承的基类,那么使用最底层的派生类(the most derived metaclass),最底层的派生类是指定的metaclass中和所有基类的metaclass的一个子类型(subtype),如果没有metaclass满足条件,会抛出TypeError的异常