如何缓存可变实例属性?

问题描述 投票:0回答:1

我可以像这样缓存实例属性:

from dataclasses import dataclass
from functools import cached_property

@dataclass
class Point:
    _x: float

    @cached_property
    def x(self):
        return self._x * 2

>> p = Point(3)
>> p.x
6

我希望每次调用时都将计算应用于

x
,使用缓存结果进行后续调用,以避免不必要的计算。

但我也想改变

x
。虽然
p.x += 1
适用于上面的代码,但很多地方都说
@cached_property
适用于不可变值。在我实际的、更复杂的代码中,它给了我奇怪的、难以理解的结果。我将此归因于当装饰器与可变属性一起使用时令人惊讶的行为(即使我不完全理解发生了什么)。

缓存在其生命周期内发生变化的实例属性的正确方法是什么?

python properties memoization
1个回答
0
投票

@cached_property
主要用于应被视为不可变的属性。 文档特别指出:

对于实例的昂贵计算属性很有用,否则这些属性实际上是不可变的。

但是,它还提到您可以通过删除该属性来清除缓存。所以你可以这样做:

del p.x
p._x = 5
print(p.x) # this will print 10
© www.soinside.com 2019 - 2024. All rights reserved.