Как в python отследить изменился ли параметр в классе?

Пишу что-то типа notepad++. Файл открывается в редакторе, и если пользователь поменял текст, но еще не сохранил его, то вкладка с именем файла должна покраснеть, типа есть несохраненные изменения. Для этого создал класс, который описывает файл. И там сделал свойство self.code в неё записывается изначальное содержимое файла. И добавил еще свойство self.new_code, в него записываю измененный пользователем текст. Потом просто сравниваю
if self.code != self.new_code:
    return True

Если пользователь сохраняет файл, то делаю просто:
self.code = self.new_code
И вот таких свойств у меня куча. Может как-то более элегантно можно решить задачу отслеживания изменений параметров?
  • Вопрос задан
  • 797 просмотров
Решения вопроса 1
@Tirael78
Конечно можно. Нужно использовать дискрипторы, в очень облегченном виде что то типа:

class Notepad:
    def __init__(self):
        self._is_change = False
        self.code = None

    def __setattr__(self, key, value):
        if key is 'code' and value is not None:
            self.__dict__['_is_change'] = True
            self.__dict__['code'] = value
        else:
            self.__dict__[key] = value

    def save(self):
        print('Тут вот сохранили данные на диск')
        self._is_change = False

    @property
    def is_change(self):
        return self._is_change


note_text = Notepad()
print('is_change {}'.format(note_text.is_change))
print('Изменили данные в self.code')
note_text.code = 'bla bla'
print('is_change {}'.format(note_text.is_change))
note_text.save()
print('is_change {}'.format(note_text.is_change))


на выходе получим
is_change False
Изменили данные в self.code
is_change True
Тут вот сохранили данные на диск
is_change False
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
И вот таких свойств у меня куча.

Инкапсулировать в класс значит, и где нужно юзать либо его, либо наследника.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы