基本元類

當使用三個引數呼叫 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 元類的這個深入描述以獲取更多詳細資訊。