Possible Duplicate:
python: are property fields being cached automatically?
作为对 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)
我假设直到第一次调用时才计算面积,但是一旦调用,该值是缓存起来直到发生变化还是每次调用时都重新计算?
换句话说,如果我有一个属性(不像这个)计算起来相对昂贵并且会被重复使用,我应该让它成为一个属性,还是将它作为一个值存储更有效并明确地在真正需要更新时计算它?
属性不会被缓存,除非你明确地这样做,所以每次访问属性时都会运行代码。尝试:
@property
def area(self):
try:
return self._area
except AttributeError:
area = pi*self.r**2
self._area = area
return area
如果您希望能够偶尔根据需要重新计算值,请执行以下操作:
@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
或者,如果您想更自动地执行此操作:
@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