适当改变映射对象的 __setattr__ 方法
Appropriately altering __setattr__ method for mapped objects
所以,我有一个 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__
。我怎样才能达到同样的效果?
在另一个问题上找到了解决这个问题的好方法。可以只调用 super 方法而不是直接改变 __dict__
下面的方法达到了预期的效果:
def __setattr__(self, name, value):
if name == <attribute>:
redis.set(self.id, value)
super(Dataset, self).__setattr__(name, value)
所以,我有一个 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__
。我怎样才能达到同样的效果?
在另一个问题上找到了解决这个问题的好方法。可以只调用 super 方法而不是直接改变 __dict__
下面的方法达到了预期的效果:
def __setattr__(self, name, value):
if name == <attribute>:
redis.set(self.id, value)
super(Dataset, self).__setattr__(name, value)