python元类(metaclass)浅谈
我们经常会听到元数据,那么元数据到底是什么数据呢,其实它就是描述数据的数据,比如我们有一个txt文件,那么txt文件中的文本,就是我们所需要的数据,而像文件大小,文件格式等我们则称之为元数据。
python中的元类顾名思义就是用来描述我们创造的类的类,听起来是否有点拗口,那就show the code,
那面举一个简单的例子
实例
class TestMetaClass(type): # 定义元类TestMetaClass
def __new__(cls, name,base, attr):
def get_id(self):
print "this is get_id func"
print "generate the Test class"
attr['get_id'] = get_id
return type.__new__(cls, name, base, attr)
class Test(object): # 定义类Test
__metaclass__ = TestMetaClass
def __init__(self):
print "init class Test"
if __name__ == '__main__':
test = Test() # 实例化Test得到test
test.get_id() # 运行test的get_id方法
# 得到输出
# generate the Test class
# init class Test
# this is get_id func
从上面的输出我们可以看到我们在实例化Test类的时候,首先是生成Test类,然后再实例化Test类,最后我们执行了Test类中并没有定义的get_id方法,而且得到了输出,我们可以看到这个get_id方法是我们在元类中加上去的,说明我们的元类可以控制类的一些行为。比如我们类方法及属性如果带有敏感字符,我们都可以通过元类一一检测出来,并抛出异常不予生成通过,还有ORM的应用也是在元类中定义了映射关系,我们只需要很方便的在类中定义字段就可以了。