day38

丶灬走出姿态 提交于 2019-12-03 11:43:16

目录

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'

主函数下打印表名称空间里面的内容,一条条字段,也就是表的内容

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!