如果你看过比较优秀的 Python 开源框架,肯定见到过元类的身影。例如,在一个类中定义了类属性 __metaclass__,这就说明这个类使用了元类来创建。
那元类的实现原理究竟是怎样的?使用元类能帮我们在开发中解决什么样的问题?
这篇文章,我们就来看一下 Python 元类的来龙去脉。
什么是元类?
我们都知道,定义一个类,然后调用它的构造方法,就可以初始化出一个实例出来,就像下面这样:
- class Person(object)
- def __init__(name):
- self.name = name
- p = Person('zhangsan')
那你有没有想过,我们平时定义的类,它是如何创建出来的?
别着急,我们先来看一个例子:
- >>> a = 1 # 创建a的类是int a是int的实例
- >>> a.__class__
- <type 'int'>
- >>> b = 'abc' # 创建b的类是str b是str的实例
- >>> b.__class__
- <type 'str'>
- >>> def c(): # 创建c的类是function 方法c是function的实例
- … pass
- >>> c.__class__
- <type 'function'>
- >>> class D(object): # 创建d的类是D d是D的实例
- … pass
- >>> d.__class__
- <class '__main__.D'>
在这个例子中,我们定义了 int、str、function、class,然后分别调用了它们的__class__ 方法,这个 __class__ 方法可以返回实例是如何创建出来的。
从方法返回的结果我们可以看到:
- 创建整数 a 的类是 int,也就是说 a 是 int 的一个实例
- 创建字符串 b 的类是 str,也就是说 b 是 str 的一个实例
- 创建函数 c 的类是 function,也就是说 c 是 function 的一个实例
- 创建实例 d 的类是 class,也就是说 d 是 class 的一个实例
除了这些之外,我们在开发中使用到的例如 list、dict 也类似,你可以测试观察一下结果。
现在我们已经得知,创建这些实例的类是 int、str、function、class,那进一步思考一下,这些类又是怎么创建出来的呢?
同样地,我们也调用这些类的 __class__ 方法,观察结果:
- >>> a = 1
- >>> a.__class__.__class__
- <type 'type'>
- >>>
- >>> b = 'abc'
- >>> b.__class__.__class__
- <type 'type'>
- >>>
- >>> def c():
- … pass
- >>> c.__class__.__class__
- <type 'type'>
- >>>
- >>> class D(object):
- … pass
- >>> d = D()
- >>> d.__class__.__class__
- <type 'type'>
从结果我们可以看到,创建这些类的类,都是 type,所以 type 就是创建所有类的「元类」。也就是说,元类的作用就是用来创建类的。