2016-06-25 2 views
1

Итак, у меня есть веб-приложение, где есть определенный объект базы данных с атрибутами, которые я хотел бы кэшировать в магазине redis. Относительно просто сделать вручную, с чем-то, как показано ниже:Соответственно изменение метода __setattr__ для сопоставленных объектов

db_object.update({<attribute>: <value>}) 
redis.set(db_object.id, <value>) 

Проблема здесь в том, что это признак, который изменяется во многих местах по всему кодовую. Не означает, что этот подход не будет работать, это просто означает, что он делает код очень повторяющимся. Я бы предпочел просто иметь оболочку для кеша, к которой я могу получить доступ, когда мне нужно. Это означает, что в любое время изменить конкретный атрибут я заинтересован в Я хотел бы обновить свой REDIS магазин, теоретически так:

def __setattr__(self, name, value): 
    self.__dict__[name] = value 
    if name == <attribute>: 
     redis.set(self.id, value) 

, который позволит решить все мои проблемы. Единственная проблема заключается в том, что, как подробно here, я не могу напрямую изменить __dict__ в отображаемых объектах. Как я могу достичь такого же эффекта?

ответ

0

Нашел хороший способ приблизиться к этому вопросу по другому вопросу. Можно просто назвать супер метод вместо прямого изменения __dict__

Метод ниже имеет желаемый эффект:

def __setattr__(self, name, value): 
    if name == <attribute>: 
     redis.set(self.id, value) 
    super(Dataset, self).__setattr__(name, value) 
Смежные вопросы