2020/01/31 05-元编程(面试会问)

在这里插入图片描述元编程的概念来自于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,
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值