天天看點

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都來自于

type

type

,作為metaclass,建立了以上所有的class object。

type

是Python定義好的metaclass。當然,我們也可以自定義metaclass。