概述
在我們深入細節之前,一個概括性的說明是必不可少的。
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的執行個體。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iYyYGM2kjZ0YjZxQGNwcTMwE2NmBTOiVzNhRzNyQjMi9CXxAzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
詳述
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。