元编程的概念来自于LISP和smalltalk语言,ruby和python都支持元编程,一般我们用不到,但是面试会考,用代码来生成代码叫元编程,用来生成代码的程序叫元程序
总结:python中
所有非object类都继承自object类,所有的继承类找跟都是obejct,新式类
所有类的类型包括type类都是type
type类继承自object类,object类的类型也是type类,多继承就需要看MRO
type之前当做内建函数
type是一个类,object也是一个类
object是管继承路线的,凡是类的类型都是type管的
所有的类本身就是类对象
这种方式创建的类等价于class构造类
构造的类一模一样,只不过语法不一样
还需要加一点东西
什么都不写也是继承object
所以字典是类属性
字典是类属性也就是,在CLASS A里面写x=100,想写什么就写什么
但是习惯写一模一样
但是拿类来调用方法是可以的,但是会有些问题,缺第一参数self’
x对象没有属性y
这里new会调用初始化函数,做完new就紧接着要init
show方法返回return none
通过type这个类,提供的几个参数,就可以把这个东西像编程一样凑出来,
也可以直接实例化.调用方法,实例做绑定,绑定是临时的,使用完就立马消失了
可以不用class关键字,用type类可以构造出来,这是用type类来构造出一个类,相当于一个class关键字来定义一个类,只不过这个字典
只不过这个字典,是类的
这是实例的
这是用type来构建一个类的定义,相当于class
这个是继承自type,刚才是用type来定义
本来是继承自object,现在继承自type就已经发生变化了
从type走,跟以前的路线就有差别了,原来类的定义都是用type来构造的,现在用type派生出子类,这个类称为元类,这个类是用来构建其他类的,跟type一样,是type子类
原来的new方法是走object那条线的,现在走type,传参完全不同
现在是告诉一个类,准备使用一个元类来构造我这个类,(元类是构造的这个类)现在采用modelmeta来构造
虽然实际语句没写,但是类对象A要构造出来
kwargs字典为空
元组是由可变参数提供,有名字,字典,元组
之前在builtins里看的
虽然会问,但是这个是原子弹技术,可能用不上
都是A的,发现把这些信息传递给了元类来帮你构建出类对象,(原来构建是跑type那里去的,type执行不打印,什么都看不到,现在中间加了个元类,元类继承自type,现在中间从元类走,然后调用父类去了,super().new)
也就是通过元类,多绕一个类,多做一些事情,走type不能改源码,走你的元类,你就可以修改源码
以前遇到类这么打印是type,现在用了元类之后,就不一样了
第二种继承方式
B继承自A,也是构建的时候不找type,找modelmeta
父类用什么构造。B就用什么构造
执行一下查看C的调用
也到了元类里面了
继承自type,type有什么能力就有什么能力,就能构建一个什么类
type都是走的元类的构造,虽然都甩给type来做,但是都经过modelmeta
type(D)应该是什么
D打印的是type
继承自modelmeta,并没说元类要改变,所以还是用type模版来做,所以这种方式不会触发元类
D和E都没有走到new方法来
这个就相当于还是用type来构建一个类
这样打印出来就还是type
主要看前三个
第一个可以像type一样,用modelmeta来构建一个类定义,也可以在类上指定元类是谁
A类,子类就都走这条线
元类的技术是来做框架的,搭架子可以把所有类的模式改变掉,都走这个元类,在元类里统一做操作,不写框架这个技术根本用不到
现在有一个user表
一个表,一个字段,是否主键,是否为空都可以定义
现在其实就是在写ORM框架,要写一大堆
想要用元类技术,也就是MetaBase要继承自某个类,一个元类ModelMeta 继承自type即可
跟之前的A,B一样
ORM背后原理就是如下的代码
attr是类属性,如果没有类属性,可以补充一个,这就是使用元类动态注入表名
没有才注入一个
这只是第一步,只是做模拟,如何判断这个是不是主键
看下里面内容是什么,id在里面,name,age都在里面
name,age,都有,是field实例
k是类属性名,v field对象,现在field缺名字,正好是类属性名
动态添加进去,主键也有了,可以把主键增加到类属性上,
如果缺少字段名,也填充好了
看不清楚可以添加repr
age什么都没写,字段名就是age
也可以最后都转换成小写
emp还是从MetaBase继承
filed初始化参数很多,全部同一做处理
统一在这里做处理
这就是一套框架,ORM框架的基本思想,内部使用元类编程,内部所有的类只需要从它那里继承就可以让这些类可以做统一的操作,然后解决一些问题
学习元类编程需要从type入手,元类需要从type继承,由元类构造一个新类,有三种方式:
1.ModelMeta(type)本身作为元来构造,送三个参数进去。
2.用class来构造的时候,后面的继承列表先不写继承了,直接写key=metaclass=元类,用这个元类来构造自己
3.或者找个构造的元类,下面子类也使用找个元类
**
这两个都跑到元类这里来构造,然后拦截做相应操作
这两种方式构建出一个类,元类的new方法,和普通的new方法参数不一样,不可以混在一起
元编程一般用于框架开发,Django,SQLAlchemy,