Python 程式設計/元類
外觀
(從 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
透過以這種方式建立自定義元類,可以改變類的構建方式。這允許您在建立類時新增或刪除屬性和方法,註冊類的建立和子類的建立以及各種其他操作。
