元类基础

Python 中一切事物都是类型的实例.

数值是数字类型的实例, 字符串是字符串类型的实例, 对象是类-类型的实例

同样的, 类(就是那个用 class 关键字创造出来的东西), 也是某种类型的实例

这种类型就叫元类.

如果说类是创建对象的模板, 那么元类就是创建类的模板

下面的代码就创建了一个名为 meta 的元类, 当然, 这个元类什么都没定义

meta = type('meta', (object,), {})

当然, 元类的定义还有其它方法, 还请自行 Google

2.* 和 3.* 的坑

因为元类可能复用, 而要创建的类也会有一些自己的属性.

所以我们一般会这么写

class Cls(object):
    __metaclass__ = meta
    def method_of_cls(self):
        pass

但是这么写有一个问题 – 不兼容 3.*

3.* 中, 元类语法不是上面这个样子

而是:

class Cls(metaclass=meta):
    def method_of_cls(self):
        pass

而且, 两种写法完全不兼容(不像 print)

兼容写法

语法上不兼容就没撤了?

如果真要兼容 2.*3.*, 只能放弃 class 关键字, 直接使用 type 的返回值

Cls = meta

有需要自定义的方法的情况, 将 type 的调用封装一下就可以了.

def meta(name, parents, attrs):
    # do sth with name/parents/attrs
    return type(name, parents, attrs)

Cls = meta('Cls1', (object,), {})

def method_of_cls2(self):
    pass
Clas = meta('Cls2', (object,), {'method_of_cls2': method_of_cls2})

  Python
  Python, 元类, 面向对象