将@property方法python重新分配给object

时间:2017-02-23 12:59:36

标签: python python-3.x properties

我试图计算一次值(因为它需要很长时间),然后存储该值以便可以再次使用。
我知道types.MethodType但我想引用一个属性而不必调用它。

import types

class stuff:
  @property
  def compute_once(self):
    takes_long_time_to_calculate = 5 - 2
    self.compute_once = takes_long_time_to_calculate
    return takes_long_time_to_calculate

instance = stuff()

print(instance.compute_once)
print(instance.compute_once)

错误讯息:

Traceback (most recent call last):
  File "try.py", line 12, in <module>
    print(instance.compute_once)
  File "try.py", line 7, in compute_once
    self.compute_once = takes_long_time_to_calculate
AttributeError: can't set attribute

1 个答案:

答案 0 :(得分:2)

您只需将昂贵计算的结果存储在另一个属性中。您可以通过为其指定一个前导下划线来将其标记为私有。这只是一个惯例,Python并没有对这些属性做任何特别的事情,但是代码的用户会知道他们不应该直接干涉它。 Python并没有真正拥有私人属性,相反它具有&#34;我们在这里同意成年人的理念&#34;。见https://stackoverflow.com/a/70736/4014959

class Stuff:
    def __init__(self):
        self._compute_once = None

    @property
    def compute_once(self):
        if self._compute_once is None:
            print('Doing expensive calculation')
            self._compute_once = 2 * 3 * 5 * 7
        return self._compute_once

instance = Stuff()

print(instance.compute_once)
print(instance.compute_once)

<强>输出

Doing expensive calculation
210
210

我们会将._compute_once初始化为None,并且仅在._compute_onceNone时执行昂贵的计算。我们可以通过将._compute_once重置为None来强制重新计算。

有关属性如何工作的更多信息,请阅读Python核心开发人员(以及SO老手)Raymond Hettinger的优秀Descriptor HowTo Guide