Python属性更改侦听器模式

Nix*_*Nix 11 python

有人知道跟踪python中字典对象的更改的任何简单方法吗?我处于一个很高级别的crud,所以我有几个方法来处理更改字典,如果字典更改我想调用一个函数来基本上做一个Observer/Notify.

 class MyClass(object):
     def update(self, item):
        changed = False

        if(self.my_dict.has_key(item.id)):
           self.my_dict[item.id] = item
           changed = True

        if(changed):
          self.notify()
Run Code Online (Sandbox Code Playgroud)

我试图避免的是所有跟踪(设置布尔值)代码.希望有一种更简单的方法来跟踪变化.这是一个简单的例子,但可能有更复杂的逻辑导致我必须设置更改的标志.

Sve*_*ach 12

您可以从dict类派生并在任何更改上添加回调.这需要覆盖任何更改字典的方法:

class NotifyDict(dict):
    __slots__ = ["callback"]
    def __init__(self, callback, *args, **kwargs):
        self.callback = callback
        dict.__init__(self, *args, **kwargs)
    def _wrap(method):
        def wrapper(self, *args, **kwargs):
            result = method(self, *args, **kwargs)
            self.callback()
            return result
        return wrapper
    __delitem__ = _wrap(dict.__delitem__)
    __setitem__ = _wrap(dict.__setitem__)
    clear = _wrap(dict.clear)
    pop = _wrap(dict.pop)
    popitem = _wrap(dict.popitem)
    setdefault = _wrap(dict.setdefault)
    update =  _wrap(dict.update)
Run Code Online (Sandbox Code Playgroud)

  • @VijayVaradan这只适用于第一级属性更改.所以,如果我有一个`obj`并且它有一个`dict`并且我修改了字典,那么这个改变就不会被拿起来.它只会选择`obj.xyz`,这有意义吗? (3认同)