-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] 
}

如果我按以下顺序调用类 def:

mydef()
mydef2()
mydef3()

在 mydef3() 中获取旧功能

我知道我认为它是 python 的速度优化部分,所以它阻止再次编译同一个类并导入它,但它应该编译,因为类已被修改。

请帮帮我?

4

2 回答 2

1

在单个解释器会话中import,即使源文件已被修改,也只能导入一次模块。模块对象在第一次导入时存储在sys.modules字典中,所有后续导入都使用该对象。您可以使用reload()重新加载模块,但修改源文件可能是实现您想要做的最难的方法。如果您发布有关您的实际目标的更多信息(即,为什么您认为需要修改磁盘上的源文件并重新导入它),有人可能会提出更好的方法。

于 2013-03-29T05:31:03.907 回答
0

您可能想研究子类MyClass化而不是修改它。其他代码可能正在使用MyClass并且可能不知道您的修改。

例如,

我的模块.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 回答