概述
在我们深入细节之前,一个概括性的说明是必不可少的。
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的实例。
详述
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都来自于type
。type
,作为metaclass,创建了以上所有的class object。
type
是Python定义好的metaclass。当然,我们也可以自定义metaclass。