Python 基于另一个特性自动设置特性的值,并将其缓存以供以后使用

Python 基于另一个特性自动设置特性的值,并将其缓存以供以后使用,python,properties,Python,Properties,我已经定义了一个类,它返回一些参数,如下所示 class PHYParams: def __init__(self, bandwidth): #Static self.n_symbols = 7 self.nrb_sc = 12 # Properties self.bw = bandwidth @property def bw(self):

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

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)

属性
NSLRB
NFFT
将在以后大量使用。然而,根据这个实现,每次我调用其中一个函数时,它都会调用get属性,这涉及到重新计算。我试图避免将它们放在
\uuu init\uu
中,因为如果我稍后更改
bw
属性,它将不会刷新其值。是否有一种缓存它们的方法,这样它们就不会每次都计算,而只会在
bw
属性更改时计算,并将它们存储为一个属性,这样我就可以像变量一样调用它们了?

只需在
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)
不要求属性只接触“它们自己的”属性状态

顺便说一句:如果有人设置了错误的bandwith值,不要使用
print()
来传达这一点。使用just override并将带宽设置为10并输出a,或者引发异常,以便开发人员通过传递错误的值来更正其代码:

@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中设置这两个属性,不要使它们成为
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)
不要求属性只接触“它们自己的”属性状态

顺便说一句:如果有人设置了错误的bandwith值,不要使用
print()
来传达这一点。使用just override并将带宽设置为10并输出a,或者引发异常,以便开发人员通过传递错误的值来更正其代码:

@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)


天啊!我怎么会错过呢?谢谢,谢谢你的警告提示。我曾想过使用
提升值错误
,但警告似乎是更好的选择!我怎么会错过呢?谢谢,谢谢你的警告提示。我曾想过使用
提升值错误
,但警告似乎更合适