__build_class__

環境

この記事の内容は、Python 3.0rc1で確認しました。

概要

クラスは、__build_class__組み込み関数によって作成されます。クラスを作成する、以下の2つのコードは、同じです。

class Foo:

    bar = 42

    def quux(self):
        print(self)
def f(__locals__):
    __locals__["__module__"] = __name__

    __locals__["bar"] = 42

    def baz(self):
        print(self)
    __locals__["quux"] = baz

Foo = __build_class__(f, "Foo")

__build_class__

__build_class__関数には、関数と、クラスの名前を渡します(これ以外にも、基底クラスなどを渡せますが、この記事では省略します)。__build_class__関数に渡す関数には、引数をひとつ持たせます。__build_class__関数は、この引数に辞書を与えます。この辞書に関数の属性を設定します。

バイトコード

普通にクラスを定義した(最初のコードのような)場合、__build_class__関数に渡される関数は、以下のようにコンパイルされます。

LOAD_FAST __locals__
STORE_LOCALS
LOAD_NAME __name__
STORE_NAME __module__
LOAD_CONST 42
STORE_NAME baz
LOAD_CONST <barのコードオブジェクト>
MAKE_FUNCTION 0
STORE_NAME bar
LOAD_CONST None
RETURN_VALUE

上で使われているバイトコードの意味は、以下の通りです。

命令 意味
MAKE_FUNCTION 関数を作成する。
LOAD_CONST 定数をスタックに積む。
LOAD_FAST ローカル変数をスタックに積む。ローカル変数は、インデックスで指定する。
LOAD_NAME ローカル変数、またはグローバル変数、または組み込み変数をスタックに積む。変数は、文字列で指定する。
RETURN_VALUE 関数から値を返す。
STORE_LOCALS スタックトップにあるオブジェクトを、ローカル変数を保存するオブジェクトにする。
STORE_NAME スタックトップをローカル変数に保存する。ローカル変数は、文字列で指定する。