python:改良廖雪峰的使用元类自定义ORM
概要
本文仅仅是对廖雪峰老师的使用元类自定义ORM进行改进,并不是要创建一个ORM框架
编写field
class Field(object):def __init__(self, column_type,max_length,**kwargs):'''1,删除了参数name,field参数全部为定义字段类型相关参数,和众多有名的orm相同2,使用反射,方便字段的扩展,如本例使用deafault就是反射的应用'''self.column_type = column_type #字段类型self.max_length=max_length #字段长度self.default=None #字段默认值,如果想扩展可以填写更多的参数if kwargs:for k,v in kwargs.items():if hasattr(self,k):setattr(self,k,v)def __str__(self):return '<%s>' % (self.__class__.__name__)class StringField(Field):def __init__(self,max_length,**kwargs):super().__init__(column_type='varchar({})'.format(max_length),max_length=max_length,**kwargs)class IntegerField(Field):def __init__(self,**kwargs):super().__init__(column_type='bigint',max_length=8)
编写metaclass
class ModelMetaclass(type):def __new__(cls, name, bases, attrs):if name=='Model':return type.__new__(cls, name, bases, attrs)mappings = dict()for k, v in attrs.items():#print('k={},v={}'.format(k,v))if isinstance(v, Field):mappings[k] = vfor k in mappings.keys():attrs.pop(k)attrs['__mappings__'] = mappings # 保存属性和列的映射关系attrs['__table__'] = attrs.get('Meta').table or name # 假设表名和类名一致return type.__new__(cls, name, bases, attrs)
编写model
class Model(dict, metaclass=ModelMetaclass):def __init__(self, **kw):super(Model, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Model' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = valuedef save(self):fields = []params = []for k, v in self.__mappings__.items():fields.append(k)params.append(getattr(self, k,v.default))sql = 'insert into {} ({}) values ({})'.format(self.__table__, self.join(fields) ,self.join(params))print('SQL: %s' % sql)#自己写了一个join函数,廖雪峰老师使用自带join,无法处理数字等非字符串类型import functoolsdef join(self,attrs,pattern=','):return functools.reduce(lambda x,y:'{}{}{}'.format(x,pattern,y),attrs)
测试
class User(Model):#使用Meta,能自定义表的相关信息class Meta:#自定义表名table='users'# 定义类的属性到列的映射:id = IntegerField()name = StringField(max_length=50)email = StringField(max_length=50,default='root@123.com')password = StringField(max_length=50)if __name__=="__main__":# 创建一个实例:u=User(id=234,name='jane',password='pwd')# 保存到数据库:u.save()#打印结果;SQL: insert into users (id,name,email,password) values (234,jane,root@123.com,pwd)
引用
1, 廖雪峰:使用元类
2, github:本文源码
python:改良廖雪峰的使用元类自定义ORM相关推荐
- python——元类、元类实现orm
元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object ...
- 《python(廖雪峰课程)》学习笔记
<python(廖雪峰课程)>学习笔记(个人检索) 1. 第一个python程序 input & output print输出字符串可以用""or'' prin ...
- python后端学习(十四)元类、ORM
目录 元类 1. 类也是对象 2. 动态地创建类 3. 使用type创建类 4. 使用type创建带有属性的类 5. 使用type创建带有方法的类 6. 到底什么是元类(终于到主题了) 7. __me ...
- 02-Python解释器-Python笔记-廖雪峰
02-Python解释器-Python笔记-廖雪峰 CPython 官方版本的解释器:CPython.这个解释器是用C语言开发的,所以叫CPython. IPython IPython是基于CPyth ...
- 开课吧python怎么样-廖雪峰官方大数据分析课程,第七期对外开放,前20名直降2000元!!!...
数据分析是程序员或者机器学习从业者最基本的一项技能,对数据进行掌握了解可以迅速抓住业务主线和数据特征! 关于数据分析的学习资料网上一抓一大把,但是一提项目实践,很多人表示手上没有数据源,不知道完整的一 ...
- 【python】廖雪峰学习笔记
廖雪峰python学习笔记 Python解释器 python 基础 输入输出 数据类型和变量 字符串和编码 list和tuple dict和set del删除的是变量,而不是数据 函数 高级特性 函数 ...
- python 多线程 廖雪峰_Python 一篇学会多线程
多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁,有点晕,所以就整个简单的范例. 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用 ...
- python元类 orm_python-进阶-元类在ORM上的应用详解
ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作S ...
- python教程廖雪峰云-Python3基础教程-廖雪峰[带标签完整版]
标签: Python教程... 5 Python简介... 7 安装Python. 12 Python解释器... 16 第一个Python程序... 18 使用文本编辑器... 19 Python代 ...
最新文章
- 《代码敲不队》第八次团队作业:Alpha冲刺 第二天
- verilog设计一个补码加减法运算器_漫画:为什么计算机用补码存储数据?
- 用于主题检测的临时日志(d94169f9-f1c0-45a2-82d4-6edc4bd35539 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...
- python什么时候用类_python中什么时候使用自定义类
- [C++] C++ Primer 笔记
- 解决mysql分页数据错乱问题
- cad2014打开文件崩溃_CAD加载自定义文件失败的拯救
- C++模板Trait
- 【clion】自定义优美的代码配色(主题)
- UDP协议和TCP协议
- 在多个浏览器中添加IDM插件
- cmd copy命令 文件复制
- windows脱壳复习
- 配置Eclipse for Java 9
- ArduinoUNO实战-第十四章-LM35温度传感器和DS18B20温度传感器
- 一种可调电子负载电路/可调恒流源电路
- win7浏览器主页修改不过来_Win7 IE无法修改默认主页怎么办?解决IE浏览器主页无法修改主页...
- WIFI 认证 测试
- 经典影视剧《大宋提刑官》——老剧重看,再添心得
- Jitter的基本知识
热门文章
- 黑色背景下,描绘照片的轮廓形状并保存
- 对照片进行边缘化处理,并将边缘化处理后的结果保存
- php静态分析工具window,window_SpeedPHP框架核心调试工具,在日常的编程开发当中,开发 - phpStudy...
- eclipseweb开发response和request接收发送数据乱码问题
- linux 系统课程-进程控制01
- Cow Contest——Floyed+连通性判断
- ffmpeg音视频基础知识
- 【Verilog】数据流建模传输问题:赋值传输有方向
- System V 消息队列
- numpy 和tensorflow 中的乘法