【问题标题】:Calling a method in setter in python在python的setter中调用方法
【发布时间】:2020-06-14 08:12:27
【问题描述】:

我想实现一个从其他属性计算的类属性。

class Sum(object):

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

    @a.setter
    def a(self, val):
        self._a = a
        self._constructSeries()

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

    @b.setter
    def b(self, val):
        self._b = b
        self._constructSeries()

    def _constructSeries(self):
        # Some calculations involving a and b
        self._series = function(a, b)

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

我知道的一种方法是将系列定义为属性

@property
def series(self):
    return fun(a,b)

但我想避免每次都调用 fun,因为这需要大量计算。处理这种情况的标准方法是什么?

【问题讨论】:

    标签: python class getter-setter


    【解决方案1】:

    如果我猜对了,您希望能够更改 a 和 b 而无需每次都计算 fun,但是当您请求 fun 的结果是最新的结果时,是否正确?

    在这种情况下你可以使用属性

    def get_series(self):
        if self._series is None or self.updated is False:
            self._series = fun(self.a,self.b)
            self.updated = True
        return self._series
    series = property(get_series)
    

    当你设置 a 和 b 时,你会更新标志

    @property
    def a(self):
        self.updated = False
        return self._a
    
    
    @property
    def b(self):
        self.updated = False
        return self._b
    

    然后self.series 返回更新后的值,但只要输入从上次计算时发生变化,它就会运行起来很有趣。

    【讨论】:

    • 你说得对。您能否再解释一下函数属性的工作原理?
    • 我刚刚在答案的底部添加了self.series 的行为,它是否足够清楚?基本上使用 property() series 成为一个“惰性”属性,仅在请求时才计算,并且在输入未更改的情况下,它直接返回先前的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2021-05-19
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多