如何在Python中记忆属性?

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

请考虑以下最小示例:

class Foo(object):

    def __init__(self):
        self.b = self.a = 1

    @property
    def sum(self):
        print 'Recalculating sum'
        return self.a + self.b

foo = Foo()
print foo.sum
print foo.sum   # Prints 'Recalculating sum' even though neither a or b has changed since previous call
foo.a = 2
print foo.sum   # a has been changed to 2 so recalculation is necessary

我想记住sum,如果self.aself.b没有改变,那么我们不需要继续重新计算财产。

只有当self.aself.b发生变化时,才能重新计算该属性 - 是否有一种简单的方法可以做到这一点?

python properties memoization
1个回答
0
投票

同时使用ab的属性并清除setter中的缓存:

class Foo(object):

    def __init__(self):
        self.a = 1
        self.b = 1

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, value):
        self._a = value
        self._clearsum()

     @property
    def b(self):
        return self._b

    @b.setter
    def b(self, value):
        self._b = value
        self._clearsum()

    def _clearsum(self):
        self._sum = None

    @property
    def sum(self):
        if self._sum is None:
            self._sum = self.a + self.b
        return self._sum

或者如果你想要更通用的东西,你也可以检查一下:Storing calculated values in an object

编辑:有人最近建议在self._sum = None中添加__init__以“在访问总和时避免错误”,但这实际上没有必要 - __init__调用a.setter,它调用_clearsum,设置_sum属性,所以它保证self._sum将被创建。

© www.soinside.com 2019 - 2024. All rights reserved.