IPython autoreload为重复调用Python2 super()提供错误

kil*_*out 5 python super python-2.7 ipython-notebook

我正在一个IPython笔记本中的原型,它从我的计算机上的模块加载Python2代码.我激活了重新加载魔术命令,以便在我进行代码更改并重新运行单元格以查看其影响时,更容易在文本编辑器和笔记本之间来回切换:

%reload_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

当我第一次在我的笔记本中调用important_method()某个NewClass实例时(意味着,在内核重置后),它运行正常.循环使得super呼叫不止一次发生!没有错误

但是,如果我去修改一些代码来我的新方法,在我的文本编辑器,并回到IPython的细胞并再次调用它,我得到以下错误在我的重载线路important_method(),其中super呼叫.

TypeError: super(type, obj): obj must be an instance or subtype of type
Run Code Online (Sandbox Code Playgroud)

注意:我尝试将新方法命名为另一个名称,因为我认为这与重载方法再次调用自身有关,但这没有帮助.此外,我希望它们是相同的名称,因为这是一个API方法,我希望遗留代码的用户能够调用他们之前知道的相同方法.

知道如何使用这些Python2 super调用在IPython笔记本中重新加载吗?

谢谢!

Mar*_*ers 2

您的现有实例仍然指向重新加载之前的旧类。

您需要重新创建实例,或更新它们的__class__属性:

instance_of_newclass.__class__ = NewClass
Run Code Online (Sandbox Code Playgroud)