我可以像这样缓存实例属性:
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
适用于不可变值。在我实际的、更复杂的代码中,它给了我奇怪的、难以理解的结果。我将此归因于当装饰器与可变属性一起使用时令人惊讶的行为(即使我不完全理解发生了什么)。
缓存在其生命周期内发生变化的实例属性的正确方法是什么?
@cached_property
主要用于应被视为不可变的属性。 文档特别指出:
对于实例的昂贵计算属性很有用,否则这些属性实际上是不可变的。
但是,它还提到您可以通过删除该属性来清除缓存。所以你可以这样做:
del p.x
p._x = 5
print(p.x) # this will print 10