1

私は数日前にPythonを使い始めたばかりで、C++のバックグラウンドから来ています。クラスを作成し、それをスクリプトで呼び出し、その後クラスのインターフェイスを更新すると、非常に直感的でない動作が発生します。

コンパイルに成功すると、クラスはもう変更できないようです。ここに例があります:

testModule.py:

class testClass:
    def __init__(self,_A):
        self.First=_A

    def Method(self, X, Y):
        print X

testScript.py:

import testModule

tm=testModuleB.testClass(10)
tm.Method(3, 4)

実行は私に与えます

3

ここで、次の引数リストを変更しますMethod

def Method(self, X):

、testModule.pycを削除し、スクリプトで呼び出します

tm.Method(3)

その結果、私は得る

TypeError: Method() takes exactly 3 arguments (2 given)

私は何を間違っていますか?スクリプトが更新されたバージョンのクラスを使用しないのはなぜですか? 私は Canopy エディターを使用していますが、この動作は python.exe インタープリターでも見られました。

また、以前に同様の質問があった場合は、申し訳ありません。この質問に関連する質問は見つかりませんでした。

4

3 に答える 3

2

Python はコード オブジェクトをメモリに読み込みます。このclassステートメントは、ファイルが最初にインポートされたときに実行され、クラスオブジェクトが作成されてモジュールの名前空間に格納されます。以降のインポートでは、作成済みのオブジェクトが再利用されます。

この.pycファイルは、次にその Python セッションでモジュールが初めてインポートされるときにのみ使用されます。ファイルを置き換えても、モジュールのリロードは発生しません。

reload()この関数を使用して、既にロードされているモジュールをディスクからの新しいコードに置き換えるよう Python に強制することができます。クラスへの他のすべての直接参照は置き換えられないことに注意してください。testClassクラスのインスタンス(tmあなたの場合)はまだ古いクラスオブジェクトを参照します。

コードを開発するときは、多くの場合、Python インタープリターを再起動して最初からやり直す方が簡単です。そうすれば、たとえば、すべての直接参照を探し出してそれらを置き換えることについて心配する必要がなくなります。

于 2015-07-14T09:43:52.517 に答える
2

testModuleすでにインタープリターにロードされています。ファイルを削除してpycも何も変わりません。reload(testModule)を実行するか、インタープリターを再起動する必要があります。

于 2015-07-14T09:40:19.033 に答える
-1

ファイルを削除して.pycも、あなたの場合は変更できません。インタープリターで初めてモジュールをインポートすると、モジュールはインタープリターに完全にロードされ、ファイルを削除したり変更したりしても何も変わりません。

インタープリターを再起動するか、組み込みreload関数を使用することをお勧めします。

于 2015-07-14T09:43:56.633 に答える