第13章 面向对象编程(17)

13.16.5 元类和__metaclass__

1. 元类(Metaclasses)是什么

元类让你来定义某些类是如何被创建的,从根本上说,赋予你如何创建类的控制权。

从根本上说,你可以把元类想成是一个类中类,或是一个类,它的实例是其他的类。当你创建一个新类时,你就是在使用默认的元类,它是一个类型对象(对传统的类来说,它们的元类是types.ClassType)。当某个类调用type()函数时,你就会看到它到底是谁的实例。

>>> class D(object):
... 	pass
... 
>>> class E:
... 	pass
... 
>>> type(E) is types.ClassType
True
>>> type(D) is type
True
>>> 

2. 什么时候使用元类

元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上查找父类中的__metaclass__。所有新风格的类如果没有任何父类,会从对象或类型中继承(type(object)当然是类型)。

如果还没有发现__metaclass__属性,解释器会检查名字为__metaclass__的全局变量;如果它存在,就使用它作为元类。否则,这个类就是一个传统类,并用types.ClassType作为此类的元类。如果你定义了一个传统类,并且设置它的__metaclass__=type,其实你是在将它升级为一个新风格的类!

3. 谁在用元类

你通过定义一个元类来“迫使”程序员按照某种方式实现目标类,这将既可以简化他们的工作,也可以使所编写的程序更符合特定标准。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值