18

如果我想在 ipython 中重新定义先前定义的类的成员,我想知道一个好方法。说:我已经定义了一个如下所示的类介绍,稍后我想重新定义部分函数定义_print_api。无需重新键入即可做到这一点的任何方法。

class intro(object):
   def _print_api(self,obj):
           def _print(key):
                   if key.startswith('_'):
                           return ''
                   value = getattr(obj,key)
                   if not hasattr(value,im_func):
                           doc = type(valuee).__name__
                   else:
                           if value.__doc__ is None:
                                   doc = 'no docstring'
                           else:
                                   doc = value.__doc__
                   return '        %s      :%s' %(key,doc)
                   res = [_print(element) for element in dir(obj)]
                   return '\n'.join([element for element in res if element != ''])
   def __get__(self,instance,klass):
           if instance is not None:
                   return self._print(instance)
           else:
                   return self._print_api(klass)
4

5 回答 5

12

使用 %edit 命令或其别名 %ed。假设 intro 类已经存在于 ipython 命名空间中,键入%ed intro将在该类的源代码上打开一个外部编辑器。当您保存并退出编辑器时,代码将由 ipython 执行,有效地重新定义了类。

这样做的缺点是任何已经存在的实例仍将绑定到该类的旧版本 - 如果这是一个问题,那么您需要重新创建对象或重新分配 obj。class属性指向新版本的类。

您还可以%ed在模块、文件和以前的输入行上使用,例如%ed 5 10:13 16将创建和编辑由 ipython 输入行 5、10、11、12、13、16 组成的文件。

于 2010-04-06T16:40:16.657 回答
6

如果你使用 IPython 的 %edit 特性,你可以使用类似这样的东西

于 2010-04-06T16:39:48.060 回答
0

没有真正的“好”方法来做到这一点。你能做的最好的事情是这样的:

# class defined as normally above, but now you want to change a funciton
def new_print_api(self, obj):
    # redefine the function (have to rewrite it)
    ...
# now set that function as the _print_api function in the intro class
intro._print_api = new_print_api

即使您已经定义了介绍对象(也​​就是说,当您在已创建的对象上调用 introObject._print_api 时,它将调用您设置的新函数),这也将起作用。不幸的是,你仍然需要重新定义函数,但至少你不必重写整个类。

根据您的用例,最好的办法可能是将它放在一个单独的模块中。import类,当您需要更改某些内容时,只需使用该reload()功能。但是,这不会影响该类的先前实例(这可能是也可能不是您想要的)。

于 2010-04-06T16:16:16.540 回答
0

当你有这么多代码时,最简单的方法就是把它放到一个文件和import那个特定的模块中。然后当您需要更新时,您可以编辑文件并重新运行import语句,您将获得更新后的代码,尽管之前定义的对象不会获得更新。

于 2010-04-06T16:19:24.723 回答
0

我在使用%edit魔法类时遇到了问题,并得到了之前评论中提到的相同类型的错误:

WARNING: The file 'None' where '<class '__main__.intro'>' was defined cannot be read.

如果你这样做%edit intro._print_api(或你的类中的任何其他方法),你可以解决这个问题并编辑类定义,因为你正在编辑的函数是在类定义中定义的,你可以在你的$EDITOR.

不幸的是,我没有足够的声誉来发表评论,所以我不得不发布一个新的答案。对此感到抱歉,但我希望这对某人有所帮助!:D

于 2019-09-21T21:02:36.353 回答