可能重复:
python:属性字段是否自动缓存?
考虑到python中属性的有效性,我想知道它们被调用的时间和频率.
要使用一个简单的例子,假设我是一个子类namedtuple,我有类似的东西:
from collections import namedtuple
from math import pi
class Circle (namedtuple('Circle', 'x, y, r')):
__slots__ = ()
@property
def area(self):
return pi*self.r**2
unitCircle = Circle(0, 0, 1.0)
print 'The area of the unit circle is {0} units'.format(unitCircle.area)
Run Code Online (Sandbox Code Playgroud)
我假设在第一次调用区域之前不会计算该区域,但是一旦调用该区域,该值是否会缓存,直到某些内容发生变化或每次调用它时是否重新计算?
换句话说,如果我有一个属性(不像这个)计算相对昂贵并将被重复使用,我应该让它成为一个属性,还是更有效地将它存储为一个值并明确地将其解析为它真的需要更新?
Sil*_*Ray 10
除非您明确地执行属性,否则不会缓存属性,因此每次访问属性时都会运行代码.尝试:
@property
def area(self):
try:
return self._area
except AttributeError:
area = pi*self.r**2
self._area = area
return area
Run Code Online (Sandbox Code Playgroud)
如果您希望偶尔重新计算按需价值,请执行以下操作:
@property
def area(self):
try:
return self._area
except AttributeError:
self.recalc_area()
return self._area
def recalc_area(self):
self._area = pi*self.r**2
Run Code Online (Sandbox Code Playgroud)
或者,如果您想更自动地执行此操作:
@property
def area(self):
try:
return self._area
except AttributeError:
area = pi*self.radius**2
self._area = area
return area
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, radius):
try:
del self._area
except AttributeError:
pass
self._radius = radius
Run Code Online (Sandbox Code Playgroud)