4

在交互式 Python 会话中,我有时会做一些愚蠢的事情,例如

plot.ylimits = (0,100)

其中 plot 是某个 Plot 类的一个实例,而 ylimits 是它的一个方法。我应该点击这个:

plot.ylimits(0,100)

Python 的工作方式,绘图对象现在有一个名为 ylimits 的新成员,它保存一个元组作为它的值,方法,最初由 Plot 类提供的可执行子例程,它曾经被 ylimits(...) 调用是走了。也许在我脑海中的某个地方,我认为 ylimits 是一个属性,并且分配给它会调用一些隐藏的 setter 方法,就像在其他一些语言中所做的那样。

我怎样才能找回那个方法?只是如何修复我的绘图对象,同时留在我有许多其他变量、函数等在使用的交互式会话中?

我发现 reload(theplotmodule) 不起作用。我破坏了 Plot 的一个特定实例;刷新 Plot 类和其他东西的定义并没有帮助。

我正在使用 Python 2.7

4

3 回答 3

7

一个简单的方法是做del plot.ylimits。通常,方法是在类上定义的,而不是在实例上定义的。每次您尝试访问属性时,Python 都会查找属性,当它在实例上找不到它们时,它会转到类。当您这样做时plot.ylimits=(0,100),您创建了一个新的实例属性,因此 Python 停在那里并且不寻找类属性,即使它仍然存在。 del plot.ylimits将删除实例属性,现在plot.ylimits将通过在类中查找来再次访问该方法。

但是请注意,这仅在您覆盖的内容最初位于类而不是实例时才有效。如果您实际上将数据存储在实例上,并且您将其覆盖,那么它就永远消失了。

于 2013-01-16T06:41:00.937 回答
1

啊,BrenBarn 的回答比我的好多了,但还是……

使用 plots 类中的方法将其分配回来(假设您没有保留绑定方法)并将其转换为 MethodType,如下所示:

class C:

    def f(self):
        print "hello!"

c = C()

c.f = "opps!"

import types
c.f = types.MethodType(C.f, c)

c.f()
于 2013-01-16T06:45:13.930 回答
0

使用ipython notebook,然后您可以根据需要重新运行和修改一段代码。

ipython notebook是一个交互式 python 解释器,它使用浏览器作为前端。最初设置有点痛苦,但非常适合探索性编码。

于 2013-01-16T06:58:40.960 回答