适当地改变映射对象的__setattr__方法

时间:2016-06-25 18:40:06

标签: python orm sqlalchemy flask-sqlalchemy magic-methods

所以,我有一个Web应用程序,其中有一个数据库对象,其中包含我想在redis商店中缓存的属性。手动操作相对简单,如下所示:

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__。我怎样才能达到同样的效果?

1 个答案:

答案 0 :(得分:0)

找到一个很好的方法来解决另一个问题。可以直接调用super方法而不是直接更改__dict__

以下方法具有预期效果:

def __setattr__(self, name, value):
    if name == <attribute>:
        redis.set(self.id, value)
    super(Dataset, self).__setattr__(name, value)