我有一个非常昂贵的方法,返回2个值,它由类A
调用。因为它很昂贵,所以我使用属性对这2个值进行了延迟评估。因为我不想调用very_expensive_function
2次,所以当用户第一次想要访问这两个值中的一个时,我会同时保存这两个值
到目前为止我写了这个:
class A:
def __init__(self):
self._attr1 = None
self._attr2 = None
@property
def attr1(self):
self.calculate_metrics()
return self._attr1
@property
def attr2(self):
self.calculate_metrics()
return self._attr2
def calculate_metrics():
if self._attr1 is None:
attr1, attr2 = very_expensive_call()
self._attr1 = attr1
self._attr2 = attr2
如您所见,当用户第一次访问attr1
或attr2
时,我将两者都保存。这是正确的还是可能的?每次粘贴calculate_metrics()
副本似乎都很奇怪
简单地说,记忆就是记住你是否已经用特定的参数调用了一个函数。如果有,它只返回已经计算的返回值,而不是再次计算
字典
memo
能够记住对函数的调用,因为它是在第一次加载函数时进行计算的:对long_calculation
的每个调用共享相同的memo
字典要测试此功能,请尝试:
将这种代码插入到类中应该相当容易。如果总是需要计算属性,那么可以将调用放入
__init__
相关问题 更多 >
编程相关推荐