在理解metaclass之前,我们需要先理解Python中的class。从某种程度上来说,Python中的class的定位比较特殊。
对于大部分面向对象语言来说,class是一段定义了如何产生object的代码块。
但是在Python中,class并不只有这一角色。class实际上也是object。当我们使用class定义一个类的时候,Python会执行相应代码并在内存中创建一个名为example
的object。
但该object(class)是具有创建其他object(instance)的能力的。这也是这个object是一个class的原因。由于本质上class任然是一个object,所以我们可以对class做出以下操作:
我们可以将其赋给一个变量
我们可以对其进行拷贝
我们可以赋给其新的变量
我们可以将其作为参数赋给其他的函数
动态创建class
既然class也是object,那么我们就可以像创建普通的object一样动态创建class。
但通过这种方式创建class并没有特别动态。我们任然需要自己定义类的具体内容。考虑到class也是object,那么也一定有某种方法能够像产生instance一样产生类。
当我们使用class关键字创建类的时候,Python会自动创建对应的object。像Python中其他大多数情况一样,我们也可以手动创建这个class object。这一操作可以通过type()
实现。
究竟什么是metaclass?
metaclass就是Python中用来创建class object的class。我们可以将其看做能够产生class的类工厂。
包括int, string, function, class在内,Python中所有的东西都是object,而所有的object都是被相应的class创造的。我们可以通过__class__
的值得知这一点。