【Python学习之八】ORM
ORM
什么是ORM呢?
ORM全称是:Object-Relational Mapping。即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表。这样,写代码更简单,不用直接操作SQL语句。十分方便python的Web开发。通过编写ORM框架,我们可以通过定义一个User类来操作对应的数据库表User,因此可以写出这样的代码:
# 创建实例:
user = User(id=123, name='Michael')
# 存入数据库:
user.insert()
# 查询所有User对象:
users = User.findAll()
这样,我们就可以使用OOP来操作数据库了。上述代码中,User类负责收集数据,并尝试归类出这些数据对应数据库表的映射关系,类如对应表的字段(包含名字、类型、是否为表的主键、默认值)等。它的基类负责执行操作,比如数据库的存储、读取,查找等操作,如上述的存储数据: user.insert() ,查找数据: users = User.findAll() 。元类负责分类、整理收集的数据并以此创建一些类属性(如SQL语句)供基类作为参数,其中,元类是运行时动态创建的。
元类(metaclass)
元类是动态创建类的方法一种,另一种是通过type()函数动态创建。type()
函数既可以返回一个对象的类型,又可以创建出新的类型。比如,我们可以通过type()
函数创建出Hello
类,而无需通过class Hello(object)...
的定义。使用type()动态创建类,即一个class对象,需要传入三个参数:(1)class的名称;(2)继承的父类集合;(3)class的方法名称与函数绑定,这里我们把函数fn
绑定到方法名hello
上。通过type()
函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()
函数创建出class。
>>> def fn(self, name='world'): # 先定义函数
... print('Hello, %s.' % name)
...
>>> Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
>>> h = Hello()
>>> h.hello()
Hello, world.
>>> print(type(Hello))
<class 'type'>
>>> print(type(h))
<class '__main__.Hello'>
接下来,我们梳理一下:类、实例、元类的关系。我们都知道,先定义类,再创建类的实例;同理,元类和类的关系是,先定义元类,再创建类。连接起来就是:先定义metaclass,就可以创建类,最后创建实例。所以,元类(metaclass)允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
最新文章
- 【JSOI2007】【Bzoj1029】建筑抢修
- CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(2)CSS3利用图层叠加实现多背景
- hdu 1455 Sticks(dfs+剪枝)
- [iOS] Delphi for iOS 版本需求
- iOS字符串为空的判断
- DataSet.Clear Method ()
- asp.net中virtual和abstract的区别分析
- 如何使一个input文本框随其中内容而变化长度(转)
- JDK1.5新特性(四)&hellip;&hellip;Autoboxing/Unboxing
- textarea文本域宽度和高度(width、height)自己主动适应变化处理
- CoreJavaE10V1P3.6 第3章 Java的基本编程结构-3.6 字符串 String
- 左偏树初步 bzoj2809 &; bzoj4003
- 在CentOS7.1上安装Gitlab碰到的问题及解决方法
- Python3学习笔记--迭代器
- 【译】BERT表示的可解释性分析
- LeetCode(113):路径总和 II
- Laravel框架如何去除URL中的/public
- 百度地图插件(百度地图AK申请配置指南)
- delphi开发学习四:TClientDataSet与TDataSetProvider控件使用实例
- 从数组中查看某值是否存在,Arrays.binarySearch