根据另一个属性自动设置属性的值,并将其缓存以供以后使用

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

我已经定义了一个返回一些参数的类,如下所示

class PHYParams:

    def __init__(self, bandwidth):
        #Static
        self.n_symbols = 7
        self.nrb_sc = 12

        # Properties        
        self.bw = bandwidth        

    @property
    def bw(self):
        return self._bw

    @bw.setter
    def bw(self, value):
        if value in [10, 20]:
            self._bw = value
        else:
            print('Invalid Bandwidth value. Taking default of 10 MHz')
            self._bw = 10

    @property
    def NSLRB(self):
        return self.bw * 5

    @property
    def NFFT(self):
        return int(self.bw * 102.4)

NSLRBNFFT属性将在以后大量使用。但是,根据此实现,每次调用其中一个函数时,它都会调用涉及重新计算的get属性。我试图避免尝试将它们放入__init__,因为如果我稍后更改bw属性它将不会刷新它的值。有没有一种方法来缓存它们,以便不是每次计算,而是只在bw属性被更改时计算它们并将它们存储为属性,以便我可以像调用变量一样调用它们?

python properties
1个回答
2
投票

只需在bw setter中设置这两个属性,不要使它们成为property对象:

class PHYParams:
    def __init__(self, bandwidth):
        #Static
        self.n_symbols = 7
        self.nrb_sc = 12

        # Properties        
        self.bw = bandwidth        

    @property
    def bw(self):
        return self._bw

    @bw.setter
    def bw(self, value):
        if value in [10, 20]:
            self._bw = value
        else:
            print('Invalid Bandwidth value. Taking default of 10 MHz')
            self._bw = 10

        self.NSLRB = self._bw * 5
        self.NFFT = int(self._bw * 102.4)

不要求属性仅触及“他们自己的”属性状态。

暂且不说:如果有人设置了错误的带宽值,请不要使用print()来传达此信息。要么只使用覆盖并将带宽设置为10并输出warning with warnings.warn(),要么引发异常,以便传入错误值的开发人员可以更正其代码:

@bw.setter
def bw(self, value):
    if value not in {10, 20}:
        value = 10
        warning.warn('Invalid Bandwidth value. Taking default of 10 MHz', RuntimeWarning)
    self._bw = value
    self.NSLRB = self._bw * 5
    self.NFFT = int(self._bw * 102.4)

要么

@bw.setter
def bw(self, value):
    if value not in {10, 20}:
        raise ValueError('Invalid Bandwidth value, only 10 or 20 allowed', value)
    self._bw = value
    self.NSLRB = self._bw * 5
    self.NFFT = int(self._bw * 102.4)
© www.soinside.com 2019 - 2024. All rights reserved.