Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python属性更改侦听器模式_Python - Fatal编程技术网

Python属性更改侦听器模式

Python属性更改侦听器模式,python,Python,有人知道用python跟踪dictionary对象更改的简单方法吗?我在做crud的高级工作,所以我有两个方法来处理更改字典,如果字典发生更改,我想调用一个函数来基本上执行Observer/Notify class MyClass(object): def update(self, item): changed = False if(self.my_dict.has_key(item.id)): self.my_dict[ite

有人知道用python跟踪dictionary对象更改的简单方法吗?我在做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()

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

子类
dict
并覆盖
\uuuuuuu setitem\uuuuuuuuu
,确保在您的东西之后调用
dict.\uuu setitem\uuuuuuuuuu
,以确保项目实际得到保存

class Notifier(dict):
    def __setitem__(self, key, value):
        print 'Something is being set!'
        dict.__setitem__(self, key, value)

您可以从
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)

如果self.my_dict中的item.id{self.my_dict[item.id]=item;self.notify()}
?(请原谅大括号和分号,但是注释中有换行符)@Nix-小心怎么做,为什么?你能解释一下吗?@VijayVaradan这只适用于一级属性更改。因此,如果我有一个
obj
,它有一个
dict
,并且我修改了字典,那么更改将不会被拾取。它只会拾取有意义的
obj.xyz
?那么您将如何使用
通知程序
?当
self.\u成员
值更改时,我想知道一个对象?
通知程序
是否封装在该对象中?你能详细介绍一下这是如何使用的吗?