如何在ipython的类中自动加载函数?

如何在ipython的类中自动加载函数?,python,ipython,magic-function,Python,Ipython,Magic Function,我使用ipython的重新加载,可以自动重新加载代码更改。但是我发现,如果我向一个类中添加一些新函数,那么这个新函数就不能自动重写。有人能帮忙解决这个问题吗? 例如,我有一个文件main.py,其中包含以下代码: class A(): def f(self): print "in f" if __name__ == '__main__': from main import * a = A() a.f() 当我在ipython中使用run-I

我使用ipython的重新加载,可以自动重新加载代码更改。但是我发现,如果我向一个类中添加一些新函数,那么这个新函数就不能自动重写。有人能帮忙解决这个问题吗? 例如,我有一个文件main.py,其中包含以下代码:

class A():
    def f(self):
        print "in f"

if __name__ == '__main__':
    from main import *  
    a = A()
    a.f()
当我在ipython中使用
run-I main.py
时,我可以修改函数f并在ipython shell中使用
a.f()
来运行新函数。但如果我想添加一个新函数,例如,将类定义为:

class A():
    def f(self):
        print "in f"

    def g(self):
        print "in g"
我无法使用
a.g()
运行新函数,我将得到:

AttributeError: A instance has no attribute 'g'
因此,我的问题是如何在类中自动加载新函数而不重新运行整个代码?

您可以使用

添加新代码的工作方式相同

In [85]: eg.g()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-85-1c70170112b5> in <module>()
----> 1 eg.g()

AttributeError: module 'eg' has no attribute 'g'


[1]  + 4395 suspended  ipython
(si)
[12:02:59] ado@crystal ~
  >  vim eg.py                    # Add new code
(si)
[12:03:21] ado@crystal ~
  >  %
[1]  + 4395 continued  ipython
In [86]: eg.g()
G!
[85]中的
:例如g()
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1例g()
AttributeError:模块“eg”没有属性“g”
[1] +4395伊皮顿
(si)
[12:02:59] ado@crystal ~
>vim eg.py#添加新代码
(si)
[12:03:21] ado@crystal ~
>  %
[1] +4395续伊皮顿
在[86]中:例如g()
G

根据我的经验,仅使用autoreload无法实现您的目标。 一个诡计存在并被放置在最后

在类中添加新函数时,它将在python解释器中编译为不同的类对象。从现在起,该类对象将不同于类实例的
\uuu class\uuu
属性

我在ipython中执行了以下操作以验证这一点(假设autoreload已激活):

这表明您在向该类引入新方法时定义了一个新类,并且您的原始实例
inst
没有跟踪更改

因此,解决问题的诀窍是:

inst.__class__ = testmodule.TestClass

定义新方法后。

对于任何类定义,如

class Foo:
    pass
您可以在运行时向其实例添加属性

>>> foo = Foo()
>>> foo.bar = 23
>>> print(foo.bar)
23
比如说,。更改类定义(即属性)并期望更改自动传播到您的活动实例会适得其反(更不是说不可能)

如果您仍在考虑如何在ipython中重新加载模块,我将使用我从github中的某个酷家伙那里学到的东西。基本上

# for auto-reloading external modules
# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython
%load_ext autoreload
%autoreload 2

您必须运行代码。@ReblochonMasque有没有办法避免重新运行代码?由于重新运行的成本非常高不,您不能在不运行程序的情况下运行程序,对不起。您好,谢谢您的回答,但我想在源文件中添加一个新函数
g
,请提供完整的脚本文件。我添加了一个函数,但它找不到新函数。@maple,您需要实例化一个新的
a
>>> foo = Foo()
>>> foo.bar = 23
>>> print(foo.bar)
23
# for auto-reloading external modules
# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython
%load_ext autoreload
%autoreload 2