Идея простая. Сдаются классы по сценарию одного металасса. У каждого экземпляра есть с рождения флажок changed = False.
В каждый этот класс при создании запихивается вловарь данных, что вревращает объект в отражение полученного словаря dic.
def __init__(self, dic):
self.__dict__=dic
В определённые моменты мне надо знать, были ли изменения в хотя бы 1 аттрибуте или нет.
Видел шикарный видеопример как можно повесить счётчик на каждый метод https://www.youtube.com/watch?v=tZnBtoJoD-o
Т.к. данных в самом классе нет, я в __new__ добавляю только changed = False, остальное ожидаю увидеть в __call__. И вижу. Но одно дело сделать декоратор для метода, а другое - свойство со спрятанной функцией. Что-то вроде дескриптора. Здесь я повис. Если я сначала создаю обычное свойство и после него пытаюсь приравнять ему значение, он стирает всё свойство и добавляет значение.
Делаю например так
def __call__(self, *args, **kwargs):
obj= type.__call__(self, *args, **kwargs)
def _getter(self):
return self.Login
def _setter(self, val):
self.changed=True
self.Login = val
def _deleter(self):
del self.Login
for item, value in obj.__dict__.items():
obj.__dict__.update({item : property(_getter, _setter, _deleter)})
здесь свойство
obj.__dict__=value
здесь свойства уже нет
естественно сами функции дейсриптора нерабочие. Речь пока не о них
Может есть какой универсальный способ реакции на изменение объекта? В джанго всё просто, берёшь и ловишь сигнал.
Я честно признают, что у меня полная каша в голове от getattr, __get__, __getattr__, __getattribute__. Это какой-то ужас, не могу разобраться когда что вызывается.