Установите значения свойства автоматически на основе другого свойства и кэшируйте их для последующего использования. - PullRequest
0 голосов
/ 17 апреля 2019

Я определил класс, который возвращает некоторые параметры следующим образом

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 и сохраняли их как атрибут, чтобы я мог просто вызывать их как переменную?

1 Ответ

2 голосов
/ 17 апреля 2019

Просто установите эти два атрибута в установщике bw, не делайте их 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, и выведите предупреждение с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...