2

我有一个行为不端的 iPython,它运行了两次 getter(但不是 setter):

class C(object):
    @property
    def foo(self):
        print 'running C.foo getter'
        return 'foo'
    @foo.setter
    def foo(self, value):
        print 'running setter'

来自 ipython 的日志:

In [2]: c = C()

In [3]: c.foo
running C.foo getter
running C.foo getter
Out[3]: 'foo'

In [4]: c.foo = 3
running setter

环境是

  • Python 2.7.3(默认,2012 年 12 月 6 日,13:30:21)
  • IPython 0.13.1
  • 带有最新开发工具更新的 OSX ML
  • 一个有很多东西的venv

这不再是一个代码问题,因为这似乎不是属性正常工作的方式。

4

3 回答 3

2

这是一个老问题,但问题在 IPython 6.0.0 中仍然存在

解决方案是使用

%config Completer.use_jedi = False

在解释器中,或添加

c.Completer.use_jedi = False

到 ipython_config.py 文件

于 2017-05-18T20:36:51.803 回答
0

也许它与iPython issue 62有关。该问题已关闭,但仍然影响我和其他人。

要复制我对这个问题的特殊风格(这似乎是我的环境所独有的),将此文件另存为 doubletake.py

class C(object):
    @property
    def foo(self):
        print 'running C.foo getter'
        return 'foo'
    @foo.setter
    def foo(self, value):
        print 'running setter'

if __name__ == '__main__':
    print 'Calling getter of anonymous instance only runs the getter once (as it should)'
    C().foo
    print "Call named instance of C's foo getter in interactive iPython session & it will run twice"
    from doubletake import C
    c = C()
    c.foo

然后在 iPython 中使用这个交互式会话运行它

from doubletake import C

C().foo
# running C.foo getter
# 'foo'

c=C()
c.foo
# running C.foo getter
# running C.foo getter
# 'foo'

%run doubletake
# Calling getter of anonymous instance only runs the getter once (as it should)
# running C.foo getter
# Call named instance of C's foo getter in interactive iPython session & it will run twice
# running C.foo getter
于 2013-04-26T17:02:32.593 回答
0

Python 不会将属性存储在内存中。Python 中的属性只是一个没有 () 的方法。因此,它会在您每次访问该属性时运行。它违背了 IMO 属性的目的。您可以将属性方法的结果存储在init方法内部的属性中。但是,这是多余的,如果您需要将值持久保存在内存中,则最好不要一开始就使用属性。

就我而言,我需要存储随请求下载的文本。每次我访问该物业时,它都会从互联网上检索文本。如果您需要做一些流程密集型的事情,请使用一种方法来执行此操作并将其存储在属性中。如果它很简单,请使用属性。

于 2018-08-29T17:06:25.463 回答