Python类在编译后无法更新

时间:2015-07-14 09:37:54

标签: python module pyc

几天前我刚开始使用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解释器的这种行为。

道歉,如果之前有类似问题的话。我没有找到与此相关的问题。

3 个答案:

答案 0 :(得分:2)

testModule已加载到您的口译员中。删除pyc文件不会改变任何内容。您需要执行reload(testModule),或者甚至更好地重新启动解释器。

答案 1 :(得分:2)

Python将代码对象加载到内存中;首次导入文件时执行class语句,创建类对象并将其存储在模块名称空间中。后续导入会重复使用已创建的对象。

.pyc文件仅用于下次时间模块导入第一次Python会话。替换文件不会导致模块重新加载。

您可以使用reload() function强制Python使用磁盘中的新代码替换已加载的模块。请注意,不替换对类的任何和所有其他直接引用; testClass类的实例(在您的情况下为tm)仍然会引用旧的类对象。

在开发代码时,重新启动Python解释器并重新开始通常会更容易。这样,您就不必担心搜索所有直接引用并替换它们,例如。

答案 2 :(得分:-1)

删除.pyc文件无法对您的案例进行更改。在解释器上第一次导入模块时,它会完全加载到解释器上并删除文件或修改不会改变任何内容。

最好重启解释器或使用内置的reload函数。