0

同じモジュールで 2 つのクラスを定義していますが、最初のクラスで 2 番目のクラスを (グローバル変数として) 使用したいと考えています。

class Class1(object):
    global_c2 = Class2()

    def foo(self):
        local_c2 = Class2()

class Class2(object):
    pass

global_c2 ではエラーが発生しますが、local_c2 では発生しません。これは、コンパイラがこのファイルを調べたときに Class2 が存在することを認識できないため、理にかなっています。また、 Class2 が最初に定義されるようにクラスを切り替えると、機能します。

しかし、これを回避する別の方法があるかどうか疑問に思っていました。たぶん、Class2が存在することをPythonに伝えることができるので、心配しないでください。または、それらを正しい順序で配置する必要がありますか?

4

2 に答える 2

1

次のことができます (つまり、Class2 が宣言されたら、Class1 の内容をバックフィルします。

class Class1(object):
    pass

class Class2(object):
    pass

Class1.global_c2 = Class2()
于 2012-09-30T14:06:11.907 に答える
1

コンパイラはここでは何もしません。どちらの場合も、実行時にクラスをルックアップしてインスタンス化するために、まったく同じバイトコード シーケンスが生成されます。

違いを生むのは、ステートメントがいつ実行されるかです。Python モジュールのすべてのコードは上から下に実行されます。宣言などはなく、すべてが定義であり、すべてのバインディングは動的です。クラス定義内のコードは、クラス定義が検出されたときに実行されます (したがって、2 番目のクラスが存在し、 name にバインドされるClass2)。関数内のコードは、関数が呼び出されたときに実行されます。2 番目のクラスの定義の前に関数を呼び出さないため、その関数を呼び出すまでに使用可能になります。

それが基本的にすべてのソリューションの要約です。バインド先が存在するまでバインドを遅らせます。

于 2012-09-30T14:11:34.900 に答える