这是一个人为的玩具示例,用于触发我遇到的问题:
我有几个类,假设它们在本地文件'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 类“花哨的东西”中有一个错误,并在那里进行了一个小编辑——甚至可能只是添加了一些日志记录。然后我想重复save()
:
In [7]: c.save()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-6970514bfc33> in <module>()
----> 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 和其他地方对此问题进行了讨论,但没有明确的恢复方法。
但碰巧的是,我真的非常希望能够A.save()
在我的旧c
实例上运行稍微更新的版本。(我在内存中有 20GB 以上的数据需要大约一天半的时间才能生成,这些数据将通过超类方法以首选方式保存。我已经通过其他手动方法保存了足够的数据,我认为我'将能够c
在重新启动的 IPython 内核中重建。但是,虽然我仍然拥有真实的对象,但我更愿意对补丁进行实际测试A.save()
- 甚至可能在之前对其进行更多修复/测试完全重新启动内核。)
因此,我对任何策略或技巧感兴趣,无论它们在其他情况下多么不明智,都可以强制c
进入当前的类定义,一直向上,这样c.save()
就可以了。
有任何想法吗?
我希望任何适用于这个玩具示例的东西都可以在我的真实设置中使用,这是一个基于 CPython 2.7.10 的 IPython)。(但是,在实际情况下,这三个类位于不同的文件中。)