【问题标题】:Python class can't be updated after being compiledPython类编译后无法更新
【发布时间】:2015-07-14 09:37:54
【问题描述】:

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

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

【问题讨论】:

  • @all:谢谢,非常快速和有用的答案!

标签: python module pyc


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        相关资源
        最近更新 更多