假设您有一个从模块内的类实例化的对象。现在,重新加载该模块。您想要做的下一件事是使重载影响该类。
mymodule.py
---
class ClassChange():
def run(self):
print 'one'
myexperiment.py
---
import mymodule
from mymodule import ClassChange # why is this necessary?
myObject = ClassChange()
myObject.run()
>>> one
### later, i changed this file, so that it says print 'two'
reload(mymodule)
# trick to change myObject needed here
myObject.run()
>>> two您是否必须创建一个新的ClassChange对象,将myObject复制到该对象中,然后删除旧的myObject?或者有没有更简单的方法?
Edit: run()方法看起来像是一种静态的类样式方法,但这只是为了简洁。我希望run()方法对对象内部的数据进行操作,因此静态模块函数不能...
发布于 2009-07-03 20:24:14
下面的代码做了你想要的,但是请不要使用它,(至少在你确定你做的是正确的事情之前不要),我把它贴出来只是为了解释的目的。
mymodule.py:
class ClassChange():
@classmethod
def run(cls,instance):
print 'one',id(instance)myexperiment.py:
import mymodule
myObject = mymodule.ClassChange()
mymodule.ClassChange.run(myObject)
# change mymodule.py here
reload(mymodule)
mymodule.ClassChange.run(myObject)在代码中使用实例化myObject时,将获得ClassChange的一个实例。此实例有一个名为run的实例方法。即使在重载时,对象也会保留这个实例方法(原因由nosklo解释),因为重载只会重载类ClassChange。
在上面的代码中,run是一个类方法。类方法总是绑定到类,并在类上操作,而不是实例(这就是为什么它们的第一个参数通常被称为cls,而不是self)。Wenn ClassChange被重载,这个类方法也被重载。
您可以看到,我还将该实例作为参数传递,以使用正确的(相同的) ClassChange实例。您可以看到这一点,因为在这两种情况下都打印了相同的对象id。
https://stackoverflow.com/questions/1080669
复制相似问题