这是引发我遇到的问题的人为玩具示例:
我有几个类,假设它们在本地文件“ issue.py”中:
class A(object):
def save(self):
# fancy stuff
pass
class B(A):
def save(self):
# misc stuff
super(B, self).save()
class C(B):
pass
我在IPython会话中使用它们,也许像这样:
In [1]: %load_ext autoreload
In [2]: %autoreload 2
In [3]: from issue import A, B, C
In [4]: c = C()
In [5]: c.foo = 'whatever'
In [6]: c.save()
到现在为止还挺好.但是后来我意识到A类’fancy-stuff’中存在一个错误,并在那里进行了少量编辑–甚至可能只是添加了一些日志记录.然后,我想重复一下save():
In [7]: c.save()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 c.save()
/Users/scratch/Documents/dev2015/gensim_venv/src/gensim-develop/docs/notebooks/scratch~/issue.py in save(self)
7 def save(self):
8 # misc stuff
----> 9 super(B, self).save()
10
11 class C(B):
TypeError: super(type, obj): obj must be an instance or subtype of type
不好了!.重新加载类后,可怕的TypeError异常,而较旧的实例保留了一些较旧的超类! SO和其他地方都在讨论此问题,但没有明确的恢复方法.
但是碰巧的是,我真的很希望能够在旧的c实例上运行稍微更新过的A.save(). (我的内存中有20GB的数据,大约需要一天半的时间才能生成,这些数据将通过超类方法以首选方式保存.我已经通过其他手动方法保存了足够多的数据,我认为我能够在重新启动的IPython内核中重建c.但是,尽管我仍然拥有可靠的对象,但我还是更喜欢对修补的A.save()进行真实的测试-甚至可以进行更多修复/在完全重启内核之前对其进行测试.)
因此,我对任何策略或技巧都感兴趣,无论它们在其他情况下有多么不明智,都将c一直强制到当前的类定义中,以便c.save()可以正常工作.
有任何想法吗?
我希望所有适用于此玩具示例的东西都可以在我的实际设置中使用,这是基于CPython 2.7.10的IPython). (但是,在实际情况下,这三个类位于不同的文件中.)