我试图计算一次值(因为它需要很长时间),然后存储该值以便可以再次使用。
我知道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
答案 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_once
为None
时执行昂贵的计算。我们可以通过将._compute_once
重置为None
来强制重新计算。
有关属性如何工作的更多信息,请阅读Python核心开发人员(以及SO老手)Raymond Hettinger的优秀Descriptor HowTo Guide。