加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:47:43 所属栏目:Python 来源:网络整理
导读:我正在一个IPython笔记本中的原型,它从我的计算机上的模块加载Python2代码.我激活了重新加载魔术命令,以便在我进行代码更改并重新运行单元格以查看其影响时,更容易在文本编辑器和笔记本之间来回切换: %reload_ext autoreload%autoreload 2 我在Python 2.7.1

我正在一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读