Python使用1设置更多属性

2024-05-06 03:40:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常昂贵的方法,返回2个值,它由类A调用。因为它很昂贵,所以我使用属性对这2个值进行了延迟评估。因为我不想调用very_expensive_function2次,所以当用户第一次想要访问这两个值中的一个时,我会同时保存这两个值

到目前为止我写了这个:

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

如您所见,当用户第一次访问attr1attr2时,我将两者都保存。这是正确的还是可能的?每次粘贴calculate_metrics()副本似乎都很奇怪


Tags: 方法用户selfnonereturn属性defproperty
1条回答
网友
1楼 · 发布于 2024-05-06 03:40:18

简单地说,记忆就是记住你是否已经用特定的参数调用了一个函数。如果有,它只返回已经计算的返回值,而不是再次计算

import time
def long_calculation(x, y, memo={}):
    try:
        result = memo[x, y] # already calculated!
    except KeyError:
        # make long_calculation take a long time!
        time.sleep(2)
        result = x * y
        memo[x, y] = result
    return result

字典memo能够记住对函数的调用,因为它是在第一次加载函数时进行计算的:对long_calculation的每个调用共享相同的memo字典

要测试此功能,请尝试:

# Note that (2,2) (7,8) and (10,10) are repeated here:
test_values = ((2,2),(4,5),(2,2),(7,8),(2,3),(7,8),(10,11),(4,5),(10,10),(10,10))

for values in test_values:
    start = time.time()
    res = long_calculation(*values)
    end = time.time()
    elapsed = end-start
    print(values,' calculated in ',elapsed, "seconds")

将这种代码插入到类中应该相当容易。如果总是需要计算属性,那么可以将调用放入__init__

相关问题 更多 >