跳至內容

Python/元類

維基教科書,自由的教學讀本

在Python語言中,類(class)也是對象,即是特定類的實例。這裏的特定類就是元類(metaclass)。

Python3[編輯]

Python3的元類的新變化,見Pep 3115

元類的方法__prepare__可以被調用,以創建一個詞典或其它類,以存儲元類實例(即普通類)的類成員。[1]

元類的方法__new__可以被調用,以創建類的新實例。[2]

type作為元類[編輯]

Python的所有標準類型是"type"類的實例。即標準類型的元類是"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

使用定製元類,在創建類時可以增加或刪除屬性與方法,註冊一個類或其子類的創建。

更多資源[編輯]

參考文獻[編輯]