基本元類
當使用三個引數呼叫 type
時,它表現為(meta)類,並建立一個新例項,即。它產生一個新的類/型別。
Dummy = type('OtherDummy', (), dict(x=1))
Dummy.__class__ # <type 'type'>
Dummy().__class__.__class__ # <type 'type'>
可以將 type
子類化以建立自定義元類。
class mytype(type):
def __init__(cls, name, bases, dict):
# call the base initializer
type.__init__(cls, name, bases, dict)
# perform custom initialization...
cls.__custom_attribute__ = 2
現在,我們有一個新的自定義 mytype
元類,可用於以與 type
相同的方式建立類。
MyDummy = mytype('MyDummy', (), dict(x=2))
MyDummy.__class__ # <class '__main__.mytype'>
MyDummy().__class__.__class__ # <class '__main__.mytype'>
MyDummy.__custom_attribute__ # 2
當我們使用 class
關鍵字建立一個新類時,預設情況下會根據基類選擇元類。
>>> class Foo(object):
... pass
>>> type(Foo)
type
在上面的例子中,唯一的基類是 object
,所以我們的元類將是 object
的型別,即 type
。可以覆蓋預設值,但這取決於我們是使用 Python 2 還是 Python 3:
Python 2.x <= 2.7
特殊的類級屬性 __metaclass__
可用於指定元類。
class MyDummy(object):
__metaclass__ = mytype
type(MyDummy) # <class '__main__.mytype'>
Python 3.x >= 3.0
特殊的 metaclass
關鍵字引數指定元類。
class MyDummy(metaclass=mytype):
pass
type(MyDummy) # <class '__main__.mytype'>
類宣告中的任何關鍵字引數(metaclass
除外)都將傳遞給元類。因此 class MyDummy(metaclass=mytype, x=2)
會將 x=2
作為關鍵字引數傳遞給 mytype
建構函式。
閱讀 python 元類的這個深入描述以獲取更多詳細資訊。