Python class编译后无法更新
Python class can't be updated after being compiled
我几天前才开始使用 python,我有 C++ 背景。当我编写 class,通过脚本调用它,然后更新 class 的界面时,我发现一些行为非常不直观。
编译成功后,class好像就不能再改了。这里有一个例子:
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)
我做错了什么?为什么脚本不使用 class 的更新版本?我使用 Canopy 编辑器,但我在 python.exe 解释器中也看到了这种行为。
抱歉,如果之前有人问过类似的问题。我没有找到与此相关的问题。
testModule
已经加载到您的解释器中。删除 pyc
文件不会改变任何内容。您将需要执行 reload(testModule)
,或者更好地重新启动解释器。
Python 将代码对象加载到内存中; class
语句在首次导入文件时执行,并且在模块命名空间中创建并存储了 class object。后续导入重新使用已创建的对象。
.pyc
文件仅在 下一次 导入模块时使用 首次 Python 会话 。替换文件不会导致模块重新加载。
您可以使用 reload()
function 强制 Python 用磁盘中的新代码替换已经加载的模块。请注意,任何和所有其他对 class 的直接引用都不会被替换; testClass
class 的实例(在您的情况下为 tm
)仍将引用旧的 class 对象。
在开发代码时,重启 Python 解释器并重新开始通常更容易。这样您就不必担心寻找所有直接引用并替换它们,例如。
删除 .pyc
文件无法对您的情况进行更改。当你第一次在解释器上导入一个模块时,它会被完全加载到解释器上,删除文件或修改都不会改变任何东西。
最好重新启动解释器或使用内置的 reload
函数。
我几天前才开始使用 python,我有 C++ 背景。当我编写 class,通过脚本调用它,然后更新 class 的界面时,我发现一些行为非常不直观。
编译成功后,class好像就不能再改了。这里有一个例子:
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)
我做错了什么?为什么脚本不使用 class 的更新版本?我使用 Canopy 编辑器,但我在 python.exe 解释器中也看到了这种行为。
抱歉,如果之前有人问过类似的问题。我没有找到与此相关的问题。
testModule
已经加载到您的解释器中。删除 pyc
文件不会改变任何内容。您将需要执行 reload(testModule)
,或者更好地重新启动解释器。
Python 将代码对象加载到内存中; class
语句在首次导入文件时执行,并且在模块命名空间中创建并存储了 class object。后续导入重新使用已创建的对象。
.pyc
文件仅在 下一次 导入模块时使用 首次 Python 会话 。替换文件不会导致模块重新加载。
您可以使用 reload()
function 强制 Python 用磁盘中的新代码替换已经加载的模块。请注意,任何和所有其他对 class 的直接引用都不会被替换; testClass
class 的实例(在您的情况下为 tm
)仍将引用旧的 class 对象。
在开发代码时,重启 Python 解释器并重新开始通常更容易。这样您就不必担心寻找所有直接引用并替换它们,例如。
删除 .pyc
文件无法对您的情况进行更改。当你第一次在解释器上导入一个模块时,它会被完全加载到解释器上,删除文件或修改都不会改变任何东西。
最好重新启动解释器或使用内置的 reload
函数。