我想让一个对象像内置的list
一样运行,但其值在修改后可以保存。
我想到的实现方法是将list
包装在PersistentList
类中。对于每次可能更改列表的方法的访问,包装器会委托给包装的list
,并在调用后将其保存到键值数据库中。
代码:
class PersistentList(object):
def __init__(self, key):
self.key = key
self._list = db.get(key, [])
def __getattr__(self, name):
attr = getattr(self._list, name)
if attr:
if attr in ('append', 'extend', 'insert', 'pop',
'remove', 'reverse', 'sort'):
attr = self._autosave(attr)
return attr
raise AttributeError
def _autosave(self, func):
@wraps(func)
def _(*args, **kwargs):
ret = func(*args, **kwargs)
self._save()
return ret
return _
def _save(self):
db.set(self.key, self._list)
这个实现存在几个问题:
每次访问像
append
这样的方法时,都需要装饰一次,有没有更好的方法来装饰某个对象的多个方法?由于我没有实现 iadd 方法,因此像
l += [1,2,3]
这样的操作不起作用。
我该怎么简化这个实现?