python - 何时以及多久在 python 中计算属性?

标签 python

<分区>

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

关于python - 何时以及多久在 python 中计算属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307509/

相关文章:

python - 更改plotlys悬停提示文本颜色

python - 查找键值来自的字典

python - python环境中局部框架和全局框架的查询

python - 使用 Subprocess、Python 和 PSQL 进行多处理

python - Python - Tkinter 中只显示了对 Label 的最后修改。为什么?

python - 图像 X 轴导数的中位数

python - Django 按查询集分组并与另一个字段相乘

python - 在数据框中查找列的共现

Python 多处理与 unpicklable 对象

Python - 编辑 CSV 文件中的特定单元格