元類簡介

什麼是元類?

在 Python 中,一切都是物件:整數,字串,列表,甚至函式和類本身都是物件。每個物件都是一個類的例項。

要檢查物件 x 的類,可以呼叫 type(x),所以:

>>> type(5)
<type 'int'>
>>> type(str)
<type 'type'>
>>> type([1, 2, 3])
<type 'list'>

>>> class C(object):
...     pass
...
>>> type(C)
<type 'type'>    

python 中的大多數類都是 type 的例項。type 本身也是一個類。其例項也是類的類稱為元類。

最簡單的元類

好的,所以 Python 中已經有一個元類:type。我們可以創造另一個嗎?

class SimplestMetaclass(type):
    pass

class MyClass(object):
    __metaclass__ = SimplestMetaclass

這不會新增任何功能,但它是一個新的元類,請看 MyClass 現在是 SimplestMetaclass 的一個例項:

>>> type(MyClass)
<class '__main__.SimplestMetaclass'>

做某事的元類

在呼叫建立類的原始 __new__ 之前,執行某些操作的元類通常會覆蓋 type__new__,以修改要建立的類的某些屬性:

class AnotherMetaclass(type):
    def __new__(cls, name, parents, dct):
        # cls is this class
        # name is the name of the class to be created
        # parents is the list of the class's parent classes
        # dct is the list of class's attributes (methods, static variables)

        # here all of the attributes can be modified before creating the class, e.g.

        dct['x'] = 8  # now the class will have a static variable x = 8

        # return value is the new class. super will take care of that
        return super(AnotherMetaclass, cls).__new__(cls, name, parents, dct)