概要

本文仅仅是对廖雪峰老师的使用元类自定义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相关推荐

  1. python——元类、元类实现orm

    元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object ...

  2. 《python(廖雪峰课程)》学习笔记

    <python(廖雪峰课程)>学习笔记(个人检索) 1. 第一个python程序 input & output print输出字符串可以用""or'' prin ...

  3. python后端学习(十四)元类、ORM

    目录 元类 1. 类也是对象 2. 动态地创建类 3. 使用type创建类 4. 使用type创建带有属性的类 5. 使用type创建带有方法的类 6. 到底什么是元类(终于到主题了) 7. __me ...

  4. 02-Python解释器-Python笔记-廖雪峰

    02-Python解释器-Python笔记-廖雪峰 CPython 官方版本的解释器:CPython.这个解释器是用C语言开发的,所以叫CPython. IPython IPython是基于CPyth ...

  5. 开课吧python怎么样-廖雪峰官方大数据分析课程,第七期对外开放,前20名直降2000元!!!...

    数据分析是程序员或者机器学习从业者最基本的一项技能,对数据进行掌握了解可以迅速抓住业务主线和数据特征! 关于数据分析的学习资料网上一抓一大把,但是一提项目实践,很多人表示手上没有数据源,不知道完整的一 ...

  6. 【python】廖雪峰学习笔记

    廖雪峰python学习笔记 Python解释器 python 基础 输入输出 数据类型和变量 字符串和编码 list和tuple dict和set del删除的是变量,而不是数据 函数 高级特性 函数 ...

  7. python 多线程 廖雪峰_Python 一篇学会多线程

    多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁,有点晕,所以就整个简单的范例. 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用 ...

  8. python元类 orm_python-进阶-元类在ORM上的应用详解

    ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作S ...

  9. python教程廖雪峰云-Python3基础教程-廖雪峰[带标签完整版]

    标签: Python教程... 5 Python简介... 7 安装Python. 12 Python解释器... 16 第一个Python程序... 18 使用文本编辑器... 19 Python代 ...

最新文章

  1. 《代码敲不队》第八次团队作业:Alpha冲刺 第二天
  2. verilog设计一个补码加减法运算器_漫画:为什么计算机用补码存储数据?
  3. 用于主题检测的临时日志(d94169f9-f1c0-45a2-82d4-6edc4bd35539 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...
  4. python什么时候用类_python中什么时候使用自定义类
  5. [C++] C++ Primer 笔记
  6. 解决mysql分页数据错乱问题
  7. cad2014打开文件崩溃_CAD加载自定义文件失败的拯救
  8. C++模板Trait
  9. 【clion】自定义优美的代码配色(主题)
  10. UDP协议和TCP协议
  11. 在多个浏览器中添加IDM插件
  12. cmd copy命令 文件复制
  13. windows脱壳复习
  14. 配置Eclipse for Java 9
  15. ArduinoUNO实战-第十四章-LM35温度传感器和DS18B20温度传感器
  16. 一种可调电子负载电路/可调恒流源电路
  17. win7浏览器主页修改不过来_Win7 IE无法修改默认主页怎么办?解决IE浏览器主页无法修改主页...
  18. WIFI 认证 测试
  19. 经典影视剧《大宋提刑官》——老剧重看,再添心得
  20. Jitter的基本知识

热门文章

  1. 黑色背景下,描绘照片的轮廓形状并保存
  2. 对照片进行边缘化处理,并将边缘化处理后的结果保存
  3. php静态分析工具window,window_SpeedPHP框架核心调试工具,在日常的编程开发当中,开发 - phpStudy...
  4. eclipseweb开发response和request接收发送数据乱码问题
  5. linux 系统课程-进程控制01
  6. Cow Contest——Floyed+连通性判断
  7. ffmpeg音视频基础知识
  8. 【Verilog】数据流建模传输问题:赋值传输有方向
  9. System V 消息队列
  10. numpy 和tensorflow 中的乘法