接触过 Django 的同学都应该十分熟悉它的 ORM 系统。对于 python 新手而言,这是一项几乎可以被称作“黑科技”的特性:只要你在 models.py
中随便定义一个 Model
的子类,Django 便可以:
- 获取它的字段定义,并转换成表结构
- 读取
Meta
内部类,并转化成相应的配置信息。对于特殊的Model
(如abstract
、proxy
),还要进行相应的转换 - 为没有定义
objects
的Model
加上一个默认的Manager
开发之余,我也曾脑补过其背后的原理。曾经,我认为是这样的:
启动时,遍历
models.py
中的所有属性,找到Model
的子类,并对其进行上述的修改。
当初,我还以为自己触碰到了真理,并曾将其应用到实际生产中——为 SAE 的 KVDB 写了一个类 ORM 系统。然而在实现的过程中,我明显感受到了这种方法的丑陋,而且性能并不出色(因为要遍历所有的定义模块)。
那么事实上,Django 是怎么实现的呢?
自古以来我们制造东西的方法都是“自上而下”的,是用切削、分割、组合的方法来制造。然而,生命是自下而上地,自发地建造起来的,这个过程极为低廉。 ——王晋康《水星播种》
这句话揭示了生命的神奇所在:真正的生命都是由基本物质自发构成的,而非造物主流水线式的加工。
那么,如果 类 也有生命的话,对它自己的修饰就不应该由调用者来完成,而应该是自发的。
幸而,python 提供了造物主的接口——这便是 Meta Classes,或者称为“元类”。