【发布时间】:2015-12-24 13:00:44
【问题描述】:
我正在 IPython 笔记本中制作原型,该笔记本正在从我的计算机上的模块中加载 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 super 调用在 IPython 笔记本中使用重新加载吗?
谢谢!
【问题讨论】:
-
这太烦人了...如果我打算使用 Jupyter 笔记本,目前根本无法使用 super...
-
通常对我有用的是明确删除旧类,再次导入它,然后创建该类的新实例。所以在你的情况下
del NewClass; import NewClass; nc = NewClass(); nc.important_method()
标签: python python-2.7 ipython-notebook super