__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 | スタックトップをローカル変数に保存する。ローカル変数は、文字列で指定する。 |