6

ローカル名前空間に対してクラスを作成すると、正確にはどのように機能しますか? 例えば:

>>> def foo():
...     i = 1
...     class bar(object):
...             j = i
...     return bar
... 
>>> dis(foo)
  2           0 LOAD_CONST               1 (1)
              3 STORE_DEREF              0 (i)

  3           6 LOAD_CONST               2 ('bar')
              9 LOAD_GLOBAL              0 (object)
             12 BUILD_TUPLE              1
             15 LOAD_CLOSURE             0 (i)
             18 BUILD_TUPLE              1
             21 LOAD_CONST               3 (<code object bar at 0xb74f8800, file "<stdin>", line 3>)
             24 MAKE_CLOSURE             0
             27 CALL_FUNCTION            0
             30 BUILD_CLASS         
             31 STORE_FAST               0 (bar)

  5          34 LOAD_FAST                0 (bar)
             37 RETURN_VALUE        

私が興味を持っている特定の行は次のとおりです。

             15 LOAD_CLOSURE             0 (i)
             18 BUILD_TUPLE              1
             21 LOAD_CONST               3 (<code object bar at 0xb74f8800, file "<stdin>", line 3>)
             24 MAKE_CLOSURE             0
             27 CALL_FUNCTION            0
             30 BUILD_CLASS

私が疑問に思っている最大のことは、どの関数が作成されて呼び出されるのかということだと思いますか? そして、クロージャーがクラスにアタッチされているのはこの関数ですか、それとも他の場所で起こりますか?

4

1 に答える 1

2

クラス本体全体、つまり

j = i

はコード オブジェクトで、オフセット 21 でロードされ、オフセット 27 で呼び出されCALL_FUNCTIONます。呼び出しの結果 (ローカル名前空間) は、クラス名およびベースと共に使用され、クラスが作成されます。関数BUILD_CLASSと同様に、3 つの引数を取ります。type(name, bases, dict)

新しい型オブジェクトを返します。これは本質的に、class ステートメントの動的な形式です。name 文字列はクラス名であり、name属性になります。bases タプルは基本クラスを項目化し、bases属性になります。dict ディクショナリは、クラス本体の定義を含む名前空間であり、dict属性になります。

クラスの作成方法を説明する非常に詳細な記事「Python クラス ステートメントに関する注意事項」もあります。

于 2010-02-03T15:22:30.453 に答える