Python属性更改侦听器模式
有人知道用python跟踪dictionary对象更改的简单方法吗?我在做crud的高级工作,所以我有两个方法来处理更改字典,如果字典发生更改,我想调用一个函数来基本上执行Observer/NotifyPython属性更改侦听器模式,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
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成员值更改时,我想知道一个对象?通知程序
是否封装在该对象中?你能详细介绍一下这是如何使用的吗?