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创建出来的“实例”。

最新文章

  1. 【JSOI2007】【Bzoj1029】建筑抢修
  2. CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(2)CSS3利用图层叠加实现多背景
  3. hdu 1455 Sticks(dfs+剪枝)
  4. [iOS] Delphi for iOS 版本需求
  5. iOS字符串为空的判断
  6. DataSet.Clear Method ()
  7. asp.net中virtual和abstract的区别分析
  8. 如何使一个input文本框随其中内容而变化长度(转)
  9. JDK1.5新特性(四)&hellip;&hellip;Autoboxing/Unboxing
  10. textarea文本域宽度和高度(width、height)自己主动适应变化处理
  11. CoreJavaE10V1P3.6 第3章 Java的基本编程结构-3.6 字符串 String
  12. 左偏树初步 bzoj2809 &amp; bzoj4003
  13. 在CentOS7.1上安装Gitlab碰到的问题及解决方法
  14. Python3学习笔记--迭代器
  15. 【译】BERT表示的可解释性分析
  16. LeetCode(113):路径总和 II
  17. Laravel框架如何去除URL中的/public
  18. 百度地图插件(百度地图AK申请配置指南)
  19. delphi开发学习四:TClientDataSet与TDataSetProvider控件使用实例
  20. 从数组中查看某值是否存在,Arrays.binarySearch

热门文章

  1. Eclipse与异常处理
  2. (转)linux磁盘分区fdisk分区和parted分区
  3. Hadoop实战:微博数据分析
  4. js事件循环(event loop)
  5. 解决gradle下载慢的问题
  6. dojo topic 发布与订阅 小例子可以参考下
  7. 《Head First 设计模式》之适配器模式与外观模式
  8. HTTP缓存技术,304和200有何区别
  9. mongodb 认证方式(version:3.0.4)
  10. 初识Notification