Свойство объекта с дополнительными функциями в Python - PullRequest
0 голосов
/ 08 мая 2020

Я разрабатываю дескриптор, основываясь на идеях @property. Я хотел бы понять, есть ли какой-либо способ легко расширить поведение свойства за пределы установки / получения.

Конкретный пример: я обмениваюсь данными с устройством и хотел бы иметь свойство, которое может устанавливать / получать / обновлять. Таким образом, когда я set, я передаю новое значение устройству и сохраняю его в кеше. Когда я get, я получаю кешированное значение. Когда я update, устройство повторно запрашивает значение. Таким образом можно избежать ненужного взаимодействия с устройством, если оно явно не запущено.

Я не знаю, есть ли шаблон, который мне не хватает, и который может быть простым решением. Можно было бы сделать кеш недействительным при использовании специального значения в set, но я не думаю, что было бы хорошей идеей предполагать заданное значение c для запуска обновления.

1 Ответ

0 голосов
/ 08 мая 2020

Я до сих пор не понимаю разницы между вашими getter и updater, но вот пример кода, который реализует кеш, в котором хранятся предыдущие значения переменных. Может быть, это поможет вам найти то, что вы ищете.

class A:
    def __init__(self):
        self._a_cache = [1]

    @property  # <- this defines a.getter
    def a(self):
        return self._a_cache[-1]

    @a.setter
    def a(self, value):
        self._a_cache.append(value)

    def undo(self):
        if len(self._a_cache) > 1:
            self._a_cache.pop()
        else:
            print('No previous values')

    def update(self):
        # what is supposed to happen here as opposed to the getter?
        pass


var = A()
print(var.a)

var.a = 10
print(var.a)

var.undo()
print(var.a)

var.update()
# ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...