简要介绍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)return {'xx': 'yy'}#可以使用type动态创建一个类myclass = type("MyClass", (), {})print(myclass)s = super(myclass, myclass())#super其实返回一个super objectprint(s)#输出结果是:<super: <class 'MyClass'>, <MyClass object>>