exec模块
什么是exec?
是python的一个内置模块
它的作用?
'''
x = 10
def func1():
pass
'''
怎么用:
参数1:字符串形式的python代码
参数2:全局名称空间字典
参数3:局部名称空间字典
调用exec()
元类
什么是元类?
元类就是类的类,Chinese类的类是type,type是所有类的类,type就是一个元类
元类的作用?
元类可以帮我们控制类的创建
元类可以帮我们控制类的调用
怎么自定义创建元类?
自定义一个元类,继承type,派生出自己的属性与方法
给需要使用的类,通过metaclass指定自定义好的元类
-class Chinese(metaclass='自定义的元类'):
创建类的两种方式:
通过class关键字创建类,内部会自动调用type(),type帮我们创建一个自定义类
通过手动调用type()实例化得到自定义的类
ORM:对象关系映射——>映射到数据库MYSQL中的数据表
类名——>表名
对象——>一条记录
对象.属性——>字段
模拟Django的ORM,为了,将数据库的增删改查,全部封装成一个个的方式,比如,save,delete,updata,select
元类需要处理的问题:
给数据表类,强制必须要有一个主键
主键必须是唯一的
将数据表中,所有的字段对象,都存放在一个独立的字典中,存不是目的,目的是为了取值方便
问题:解决代码冗余问题,比如有100张表,需要些100次__init__
解决:继承一个父类,父类中定义一个——init__init__
问题:无法预测每一张表中的字段是什么,无法通过父类的__init__
解决问题
解决:通过继承字典,内部的__init__
,可以接受‘任意个数’的‘关键字参数’
问题:继承字典的类实例化的对象,无法通过“对象.属性”的方式存值
解决:通过__setattr__
,__getattr__
来实现,让字典对象与普通对象一模一样,并且具备字典原有的特性
ORM.py文件文字概述:
先创建字典的类型,对应数据表中的一个个字段的创建规范
先创建一个父类,两个子类,继承父类的方法,
定义一个元类,继承type,函数中创建一个空的对象空间,里面放类名,也就是表名,基类/父类也就是对应的记录,类的名称空间,也就是表中的字段
过滤Models类,Models类中什么都不做,将类原路返回
一张表必须有表名,假如table_name没有值,则将类名当做表名
主键名提前设置为None,
mappings设置为一个空字典
循环名称空间中所有的属性,除了有用字典,还有其他字段意外额度属性
过滤字段对象以外的内容
判断字段对象primary_key是否为true
再判断主键是否已存在,如果存在抛出错误,只能有一个主键
若不存在,则给primary_key赋值
循环key值是否在mappings中,因为mappings与元类中的属性重复,为了节省内存,剔除重复的属性
如果上面都没有主键,最后判断是否有主键,如果没有,必须有一个主键
给类的名称空间添加表名,主键名,添加一个mappings字典,字典中拥有所有字段属性
然后返回类名,父类,类名称空间
在Modles类中继承dict,metaclass是指定的自定义创建的元类
定义函数来判断打印调用没有属性时会触发,将字典的值返回,
打印key,value,设置key,value值
定义子类User和Movie类,都继承Models类
它们的字段user_id都是IntegerFeild类型的字段,字段名等于name='user_id',primary_key=True
它们的user_name,pwd都是StringFild类型的字段,name='name',name='pwd'
主函数下打印表名称空间里面的内容,一条条字段,也就是表的内容