1

几天前我刚开始使用 python,来自 C++ 背景。当我编写一个类,通过脚本调用它,然后更新类的接口时,我会发现一些我觉得非常不直观的行为。

成功编译后,该类似乎不再可更改。这里有一个例子:

测试模块.py:

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

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

测试脚本.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

testModule已经加载到您的解释器中。删除pyc文件不会改变任何东西。您将需要这样做reload(testModule),甚至更好地重新启动解释器。

于 2015-07-14T09:40:19.033 回答
2

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

.pyc文件仅在下一次Python session 首次导入模块时使用。替换文件不会导致模块重新加载。

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

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

于 2015-07-14T09:43:52.517 回答
-1

删除.pyc文件不能对您的情况进行更改。当您第一次在解释器上导入模块时,它会完全加载到解释器上,删除文件或修改不会改变任何东西。

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

于 2015-07-14T09:43:56.633 回答