读书人

简明介绍python的元编程的metaclass

发布时间: 2012-09-08 10:48:07 作者: rapoo

简要介绍python的元编程的metaclass
平时经常看到元编程、DSL这样的字眼,它到底是什么意思?
我的理解来看。元编程就是“代码生成器”,你可以通过一些代码生成另一些代码(动态地、按需的)。DSL则是domain special language:为了解决某个问题而发明的语言,比如HTML SQL YACC,它的反面是C JAVA Python这些通用语言。与DSL经常提到的是ruby,为什么说ruby可以DSL呢?因为它语法丰富,支持各种简写,lamba,闭包,block等等,通过自定义的一套高级API从而实现一门特定领域的方言。这种方言是可以交给客户写的。


python中元编程的目标是:动态生成需要的类class。我们知道class实例化后就是instance,而python中的metaclass实例化后就是class了。先看一个例子

class MyMeta(type):      def __new__(cls, name, parents, attrs):        print("new info: ", cls, name, parents, attrs)        attrs['abcde'] = 'fghijk'        return type.__new__(cls, name, parents, attrs)class C(metaclass=MyMeta):    passprint(C.abcde)

输出结果是:
#官方文档说要是classmethod类型 @classmethod def __prepare__(self, *args, **kwargs): print("__prepare__ called")# return type.__prepare__(self, *args, **kwargs) return kwargs
这个函数还要在__new__函数调用之前调用,这个函数必须返回一个用于存放类属性(namespace)的数据结构,默认情况下就是字典类型了。我在这里直接就把kwargs返回就可以,没问题的,极端点,return {}都是可以的。这里可以玩一下,比如说
return {'xx': 'yy'}

你会发现整个类中都会被添加xx这个属性……

最后附上几个小知识点:
#可以使用type动态创建一个类myclass = type("MyClass", (), {})print(myclass)s = super(myclass, myclass())#super其实返回一个super objectprint(s)#输出结果是:<super: <class 'MyClass'>, <MyClass object>>

读书人网 >编程

热点推荐