我已经定义了一个返回一些参数的类,如下所示
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属性。我试图避免尝试将它们放入__init__
,因为如果我稍后更改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)
不要求属性仅触及“他们自己的”属性状态。
暂且不说:如果有人设置了错误的带宽值,请不要使用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)