python元类

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

元类(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的异常

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航