guest@blog.cmj.tw: ~/posts $

Meta Class


class of class

Python 的 class 屬於 first-class citizen :代表在 Python 中的 class 本身也是個物件, 可以傳遞、修改、賦值等操作。

Builtin Function - type

Python 中有一個特殊的 builtin function:type,本身同時具有兩個功能:回傳物件的型態、 建立一個 type 物件。後者的功能可以用來建立一個 class,這代表 class 本身也會是一個實體 (instance), 透過 type 建立出來的實體。透過 type(name, bases, clsdict) 方式可以建立出一個 class:

  • name 會成為 class 的 name 屬性
  • bases 會成為 class 的 bases 屬性:描述物件本身的繼承關係
  • clsdict 會成為 class 的 dict 屬性:

因此在 官方文件 中可以看到兩種方式,可以建立出一樣的 class:

>>> class X:
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))

metaclass

在 Python3 的 Data Model 可以看到關於實體的各種描述,在 metaclass 章節中介紹如何使用 metaclass。 預設 Python 的每一個 class 都是透過 type 函數來建立,而客製化的 class 可以透過 metaclass 來創建。 像是以下範例就使用 Meta 這個 metaclass 來建立 MyClass,執行程式可以看到 Python 是如何按照順序執行:

class Meta(type):
    def __init__(cls, *args):
        print(f'initial metaclass for {cls} {args}')

    @classmethod
    def __prepare__(cls, *args):
        print(f'prepare metaclass for {cls} {args}')
        return {}

class MyClass(metaclass=Meta):
    def __init__(cls, *args):
        print(f'initial class on {cls} {args}')

class MySubclass(MyClass):
    def __init__(cls, *args):
        print(f'initial subclass on {cls} {args}')