Python 程式設計/元類
外觀
在 Python 中,類本身也是物件。就像其他物件是特定類的例項一樣,類本身也是元類的例項。
Pep 3115 定義了 python 3 元類的變化。在 python3 中,您有一個名為 `__prepare__` 的方法,它在元類中被呼叫以建立字典或其他類來儲存類成員。[1] 然後是 `__new__` 方法,它被呼叫來建立該類的新的例項。[2]
所有標準 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
透過以這種方式建立自定義元類,可以更改類的構造方式。這允許您在建立類時新增或刪除屬性和方法,註冊類的建立和子類的建立,以及各種其他操作。
