Я пытаюсь заставить объект действовать как встроенный список
, за исключением того, что его значение сохраняется после изменения.
Реализация, которую я придумал, представляет собой оболочку списка
в классе PersistentList
. Для каждого доступа к методу, который может изменить список, оболочка делегирует обернутый список
и сохраняет его в базе данных «ключ-значение» после его вызова.
Код:
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
, каждый раз, когда они
доступ, есть ли лучший способ украсить несколько методов некоторых
объект?
Операции типа l + = [1,2,3]
не работают, потому что я не
реализован метод iadd .
Что я могу сделать, чтобы упростить это?