Я хотел бы создать класс, который ведет себя как переменная python, но вызывает некоторую функцию обратного вызова при изменении/чтении переменной.создание класса, который ведет себя как любая переменная, но имеет обратный вызов при изменении/чтении
Другими словами, я хотел бы иметь возможность использовать класс следующим образом:
x=myClass(change_callback, read_callback)
определяет х как экземпляр MyClass. Конструктор (INIT) занимает 2 функции, В параметре: функция будет вызываться каждый раз, х изменяется, и функция будет вызываться каждый раз, х «читать»
следующее утверждение:
x=1
«сохранит» 1 и вызовет вызов change_callback(1)
, который мог бы что угодно сделать.
Следующее утверждение:
a=x
будет получить сохраненное значение и вызвать read_callback()
, которые, возможно, изменить сохраненное значение и делать другие вещи.
Я бы хотел, чтобы это работало с любым типом, например. чтобы иметь возможность написать такие вещи, как:
x=[1 2 3]
, который вызвал бы change_callback([1 2 3])
x.append(4)
вызовет change_callback([1 2 3 4])
(и, возможно, призыв к read_callback()
раньше)
x={'a':1}
вызовет change_callback({'a':1})
print(x)
спровоцирует звоните в read_callback() ... и, конечно, возвратите последнее сохраненное значение для печати.
Идея заключается в том, что любой доступ к переменной может быть зарегистрирован или генерировать другие вычисления ... без видимых на вид.
У меня такое ощущение, что это должно быть возможно, но я действительно не вижу, что мой объект должен унаследовать от ... Если мне нужно ограничить меня одним типом, например. список, есть ли способ переопределить все операторы присваивания (включая такие методы, как append() ...) в «один раз», сохраняя исходное поведение (метод базового класса) и добавляя обратный вызов ...
Или есть более подходящие способы (модули ...) для достижения тех же целей ...?
Спасибо заранее,
Одним словом, вы не можете и не должны. – delnan
С другой стороны, запись класса с атрибутом «значение», который вызывает зарегистрированные запреты, которые были изменены/прочитаны, тривиальна, читаема, поддерживается и проста. Вместо «x = 1» вы получите «x.value = 1», и вы получите все, что хотите, самыми простыми способами. – jsbueno