python 面向对象专题(十二):元类(一): metaclass概述

概述

在我们深入细节之前,一个概括性的说明是必不可少的。

class是一个对象,跟其他普通的对象一样,是某个东西的实例:比如metaclass。默认的metaclass是type。不幸的是,对于向后的兼容性,type有点乱:他同样可以用作一个function来返回一个对象的class。

class Foobar:
     pass
print(type(Foobar))
foo = Foobar()
print(type(foo))

返回值

<class 'type'>
<class '__main__.Foobar'>

如果你熟悉isinstance函数,你会知道这些:

print(isinstance(foo, Foobar))
# True
print(isinstance(Foobar, type))
# True

foo是Foobar的实例,Foobar是type的实例,也就是下图,class是metaclass的实例。

python 面向对象专题(十二):元类(一): metaclass概述

 详述

metaclass就是Python中用来创建class object的class。我们可以将其看做能够产生class的类工厂。我们可以通过如下例子理解这个关系:

 
class = metaclass()
object = class()

从上文中我们知道了type()可以被用来动态创建class,这是因为实际上type是一个metaclass。而且type实际上是Python用在在幕后创建所有class的metaclass。

包括int, string, function, class在内,Python中所有的东西都是object,而所有的object都是被相应的class创造的。我们可以通过__class__的值得知这一点。

>>> age = 24
>>> age.__class__
<type 'int'>

>>> name = 'bob'
>>> name.__class__
<type 'str'>

>>> def foo(): pass
>>> foo.__class__
<type 'function'>

>>> class Bar(object): pass
>>> bar = Bar()
>>> bar.__class__
<class '__main__.Bar'>

那么,这些__class____class__又是什么呢?

>>> age.__class__.__class__
<type 'type'>
>>> name.__class__.__class__
<type 'type'>
>>> foo.__class__.__class__
<type 'type'>
>>> bar.__class__.__class__
<type 'type'>

可以看出,所有的class都来自于typetype,作为metaclass,创建了以上所有的class object。

type是Python定义好的metaclass。当然,我们也可以自定义metaclass。