跳轉到內容

Python 程式設計/元類

來自華夏公益教科書,開放的書籍,開放的世界


在 Python 中,類本身也是物件。就像其他物件是特定類的例項一樣,類本身也是元類的例項。

Pep 3115 定義了 python 3 元類的變化。在 python3 中,您有一個名為 `__prepare__` 的方法,它在元類中被呼叫以建立字典或其他類來儲存類成員。[1] 然後是 `__new__` 方法,它被呼叫來建立該類的新的例項。[2]

type 元類

[編輯 | 編輯原始碼]

所有標準 Python 型別 的元類是 "type" 物件。

>>> type(object)
<type 'type'>
>>> type(int)
<type 'type'>
>>> type(list)
<type 'type'>

就像 list,int 和 object 一樣,"type" 本身也是一個普通的 Python 物件,並且本身也是一個類的例項。在這種情況下,它實際上是它自己的例項。

>>> type(type)
<type 'type'>

它可以被例項化以建立新的類物件,類似於上面的類工廠示例,透過傳遞新類的名稱、要繼承的基類以及定義要使用的名稱空間的字典。

例如,程式碼

>>> class MyClass(BaseClass):
...     attribute = 42

也可以寫成

>>> MyClass = type("MyClass", (BaseClass,), {'attribute' : 42})

可以透過在定義類時設定 `metaclass` 關鍵字引數來建立一個具有不同於 `type` 的元類的類。當這樣做時,該類及其子類將使用您的自定義元類建立。例如

class CustomMetaclass(type):
    def __init__(cls, name, bases, dct):
        print("Creating class %s using CustomMetaclass" % name)
        super(CustomMetaclass, cls).__init__(name, bases, dct)

class BaseClass(metaclass=CustomMetaclass):
    pass

class Subclass1(BaseClass):
    pass

這將列印

Creating class BaseClass using CustomMetaclass
Creating class Subclass1 using CustomMetaclass

透過以這種方式建立自定義元類,可以更改類的構造方式。這允許您在建立類時新增或刪除屬性和方法,註冊類的建立和子類的建立,以及各種其他操作。

更多資源

[編輯 | 編輯原始碼]

參考資料

[編輯 | 編輯原始碼]


Clipboard

待辦事項
[不完整] (參見將元類投入使用,伊拉·R·福爾曼,斯科特·H·丹福斯?)


華夏公益教科書