我正在一个IPython笔记本中的原型,它从我的计算机上的模块加载Python2代码.我激活了重新加载魔术命令,以便在我进行代码更改并重新运行单元格以查看其影响时,更容易在文本编辑器和笔记本之间来回切换:
%reload_ext autoreload
%autoreload 2
我在Python 2.7.10中工作,因为我使用了一些不能编译的遗留代码.我的部分工作是扩展这些遗留代码中的一些类并重载它们的一些方法.但是,我还需要调用一些原始的基本方法来完成重要的工作.例如:
class LegacyBase:
def important_method(self):
#old stuff i'll need
class NewClass(LegacyBase):
#overload base method
def important_method(self):
#do some new stuff
while 1:
#call old method to do stuff
super(NewClass,self).important_method() #use old Python2 super calls :(
#some break conditions
当我第一次在我的笔记本中调用了一些NewClass实例的important_method()时(意味着,在内核重置后),它运行正常.循环使得超级呼叫不止一次发生!没有错误
但是,如果我在我的文本编辑器中修改一些代码到我的新方法并返回到IPython单元并再次调用它,我在重载的important_method()中的行中得到以下错误,其中进行了超级调用.
TypeError: super(type,obj): obj must be an instance or subtype of type
注意:我尝试将新方法命名为另一个名称,因为我认为这与重载方法再次调用自身有关,但这没有帮助.此外,我希望它们是相同的名称,因为这是一个API方法,我希望遗留代码的用户能够调用他们之前知道的相同方法.
知道如何使用这些Python2超级调用在IPython笔记本中重新加载吗?
谢谢!
最佳答案
您的现有实例仍然指向重新加载之前的旧类.
您需要重新创建实例,或更新其__class__属性:
instance_of_newclass.__class__ = NewClass