-1

メインプログラムにインポートされ、ランタイム自体を再度実行するクラスランタイムを変更しようとしています。同じクラスをインポートしていますが、今回は古い機能を実行しています (クラスの変更前)。

def mydef()
{
  from myclassfile import myclass
  ---------
  ---------
}

def mydef2()
{
  from myclassfile import myclass
  ---------
  ---------
  here, Modifying class by changing code in myclassfile 
}

def mydef3()
{
  from myclassfile import myclass
  ---------
  ---------
  getting old functionality [before modification of class] 
}

次の順序でクラス定義を呼び出すと:

mydef()
mydef2()
mydef3()

mydef3() で古い機能を取得する

Pythonの速度最適化の一部だと思うので、同じクラスを再度コンパイルしてインポートすることはできませんが、クラスが変更されているためコンパイルする必要があります。

私を助けてください?

4

2 に答える 2

1

1 つのインタープリター セッション内でimport、ソース ファイルが変更されていても、モジュールを 1 回だけインポートします。モジュール オブジェクトはsys.modules、最初のインポート時にディクショナリに格納され、その後のすべてのインポートでそのオブジェクトが使用されます。を使用reload()してモジュールをリロードできますが、ソース ファイルを変更することは、やりたいことを実現するためのおそらく最も難しい方法です。実際の目標 (つまり、ディスク上のソース ファイルを変更して再インポートする必要があると考える理由) に関する詳細情報を投稿すると、誰かがより良い方法を提案する可能性があります。

于 2013-03-29T05:31:03.907 に答える
0

MyClass変更するのではなく、サブクラス化を検討することをお勧めします。他のコードが使用MyClassしている可能性があり、変更を認識していない可能性があります。

例えば、

mymodule.py:

class MyClass(object):
    def do_something(self):
        return 'Foo'

変更された.py:

from mymodule import MyClass


class ModifiedClass(MyClass):
    def do_something(self):
        original = super(ModifiedClass, self).do_something()
        return original * 2


def main():
    mycls = MyClass()
    modcls = ModifiedClass()

    print mycls.do_something()
    print modcls.do_something()


if __name__ == '__main__':
    main()

出力:

$ python modified.py
Foo
FooFoo
于 2013-03-29T06:08:46.913 に答える