由ORM谈Python元类

本文主要介绍了什么是类,如何动态的创建类,什么是元类,类的_metaclass_属性以及如何自己实现ORM。

上篇文章回顾:

浅谈TLS 1.3

在谈Python元类之前,我们先来看看ORM是什么:

ORM 为Object Relational Mapping 的简称,中文意思为对象关系映射,ORM的出现,是为了解决面向对象和关系数据库之间不相匹配而出现的技术,目的是使用面向对象的思想来实现对数据库中表的操作,从而屏蔽掉底层的SQL操作。

简单了解了ORM的概念,许多同学可能会想了解ORM是怎么实现的,以下代码摘自django项目ORM的部分实现代码:

很多同学会好奇,type 不是一般来检测Python变量的类型的嘛,怎么在这里竟然可以接受这么多参数,在这里他的用法到底是什么呢? 这就涉及到了Python 的元类(metaclass)相关知识,而ORM,则是元类的应用之一。

什么是类?

简单来说,类就是用一种使用相对固定的格式,来描述如何生成对象的一段代码,在Python中,我们使用如下格式来生成类:

但是同时,类又是一种特殊的对象,称之为classobj,可以使用type来测定出:

同时,它也具有对象的全部特征,如你可以对他进行赋值,拷贝,增加属性等的操作,如下示例:

如何动态的创建类?

最简单的方法,就是采用如下方法:

但是此类方法,不能称之为真正的动态,因为只能支持有限的类的创建,那有什么方法,能真正实现动态创建一些类呢? 所以,这里就不得不提到关键词type了,首先,我们大多数人谈起type,首先想到的是,type不就是用来测试变量类型的嘛,如下:

但是与此同时,type还有另一个神奇的能力,就是它也能动态的创建类。type可以接受一个类的相关信息作为参数,然后返回一个类。 下面是其用法:

什么是元类?

上面提到了类是一种特殊的对象,对象就必须有类来创建,而元类,就是用来创建这种类的。简单来说,用于创建类的类,就是元类。 可以理解为一下这种方式:

而type,就是元类,于是创建一个类,就可以使用如下这种方式:

类的_metaclass_属性

当我们创建一个类的时候为其添加__metaclass__属性:

那么,Python就会采用你指定的方法,来创建这个类,否则,会使用type来创建这个类,下面演示如何自定义的指定metaclass属性:

如何自己实现ORM?

首先来定义Field类,它负责保存数据库表的字段名和字段的类型:

在Field的基础上,进一步定义各种具体类型的Field,比如StringField,IntegerField等等:

下一步,就是编写最复杂的ModelMetaclass了:

以及基类Model:

创建User类,并调用save方法,保存:

上面,我们就简单实现了一个ORM。

参考链接

stackoverflow:

https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python

廖雪峰的官方网站:

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820064557c69858840b4c48d2b8411bc2ea9099ba000

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181227G0Y0Q000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券