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

标签 python python-2.7 ipython-notebook super

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

%reload_ext autoreload
%autoreload 2

我在 Python 2.7.10 中工作,因为我使用的是一些不能为 3 编译的遗留代码。我的部分工作是扩展这些遗留代码中的一些类并重载它们的一些方法。但是,我还需要调用一些原始的基本方法来完成重要的工作。例如:

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

当我调用 important_method()与一些NewClass例如在我的笔记本中第一次(意思是,在内核重置之后)它运行良好。循环是这样的 super来电不止一次!没有错误

但是,如果我在我的文本编辑器中为我的新方法修改一些代码,然后返回到 IPython 单元并再次调用它,我会在重载的 important_method() 行中收到以下错误super在哪里打电话了。

TypeError: super(type, obj): obj must be an instance or subtype of type

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

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

谢谢!

最佳答案

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

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

instance_of_newclass.__class__ = NewClass

关于python - IPython autoreload 为重复调用 Python2 super() 提供错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32803458/

相关文章:

python - 使用 Python 进行 INSERT INTO 和字符串连接

python-2.7 - 将 Oauth2 用于服务帐户(教育版)的 Google Python Admin SDK -"oauth2client.client.AccessTokenRefreshError: access_denied"异常

python - IPython3 自动配置 %matplotlib inline

python - 写入 .CSV 文件时出现问题?

python - Cloud9 Python : getting Flask module not found on Run action

Pandas (0.16.2) 显示 3 行 Dataframe

sql - 选择 SQL 作为 Jupyter Notebook 的默认单元格魔法

python - Numpy - 仅更改数组一列的值的更简单方法?

python - 使用 python 以 CSS 方式编码字符串

BeautifulSoup 的 Python 高内存使用率