2013-06-21 61 views
1

我无法弄清楚如何解决我在我的程序中使用reload时遇到的问题。 如果我的代码就像使用reload时奇怪的Python问题

import mymodule 
from mymodule import MYCLASS 

x = MYCLASS() 

然后一切工作正常。但是,如果我尝试像这样重新加载模块:

import mymodule 
from mymodule import MYCLASS 
x = MYCLASS() 
reload(mymodule) 
y = MYCLASS() 

我得到一些奇怪的错误。我明白,也许是因为MYCLASSmymodule的参考号已经改变,但无法准确理解为什么以及如何防止它。

在这种情况下重新加载导入的模块和类的正确方法是什么?

+1

确切的错误是什么? –

回答

3

您应该按照以下样式使用重新加载。

import mymodule 
x = mymodule.MYCLASS() 
mymodule = reload(mymodule) 
y = mymodule.MYCLASS() 

http://docs.python.org/2/library/functions.html#reload

如果一个模块进口...进口 使用......,呼吁其他模块重装()不会重新定义从中导入 对象从另一个模块对象 - 一种解决方法是从声明中重新执行 ,另一种方法是使用导入和限定名称 (模块。名称)。

UPDATE

isinstance(x, mymodule.MYCLASS)False,作为类被重新初始化,但仍x.__class__引用旧的阶级。

>>> isinstance(x, mymodule.MYCLASS) 
False 
>>> isinstance(y, mymodule.MYCLASS) 
True 
+1

+1。值得一提的是,在完成这样的事情之后,'isinstance(x,mymodule.MYCLASS)'将会是'False',因为类将被重新初始化,但是'x .__ class__'仍然会引用旧的类。 – mata

+0

@mata,谢谢你的建议,我更新了答案。 – falsetru