Python类编译后无法更新

标签 python module pyc

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

一旦成功编译,该类似乎就不再可以更改了。这是一个例子:

测试模块.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

现在我更改方法的参数列表:

def Method(self, X):

,我删除了 testModule.pyc 并在我的脚本中调用

tm.Method(3)

结果,我得到了

TypeError: Method() takes exactly 3 arguments (2 given)

我做错了什么?为什么脚本不使用类的更新版本?我使用 Canopy 编辑器,但我在 python.exe 解释器中也看到了这种行为。

如果之前有人问过类似的问题,我们深表歉意。我没有找到与此相关的问题。

最佳答案

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

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

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

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

关于Python类编译后无法更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31403000/

相关文章:

python - 导入前安装模块

python - 如何执行编译后的python代码

Python - 对 Pandas DataFrame 中的数据执行 FIFO 操作

ios - 为什么在将现有的原生项目与flutter代码结合时使用模块模板?

python - 在 pyspark 中不使用 pivot 进行分组的有效方法

javascript - 在 Node Express 应用程序的模块中使用变量

jython - 如何控制 $py.class 文件的去向?

python - 如何在 MySQL Workbench for Mac (Big Sur) 中添加系统路径路径

python - Pyspark:如何处理 python 用户定义函数中的空值