【发布时间】:2019-03-14 17:42:23
【问题描述】:
使用观察者模式,我有一个 dict 的子类,我在其中覆盖 __setitem__ 以在 dict 中的值发生更改时调用函数。这对于直接赋值(例如my_dict[key] = 1234)非常有效,但当我想更改存储在字典中的数组中的值(例如my_dict[key][0] = 1)时不起作用。
由于这是一个异步应用程序,我的一个想法是在__getitem__ 中安排一个未来,应用程序等待片刻,然后将键处的旧内容与当前内容进行比较,但这显然会导致竞争条件.
处理此问题的最佳方法是什么?每当我想在我的字典中存储一个数组时,我都不想使用自定义数组。
编辑:这是课程
class SettingsTable(dict):
def __init__(self, seq=None, **kwargs):
super().__init__({}, **kwargs)
self._post_process_map = {}
def add_post_process(self, key, process, *args):
if not self._post_process_map.__contains__(key):
self._post_process_map[key] = []
self._post_process_map[key].append((process, *args))
def __setitem__(self, key, value):
old_val = None
if self.keys().__contains__(key):
old_val = self[key]
super().__setitem__(key, value)
self._run_on_change_funcs(key, value, old_val)
def _run_on_change_funcs(self, key, value, old_val):
if not old_val.__eq__(value):
if self._post_process_map.__contains__(key):
for func in self._post_process_map[key]:
if func[1]:
func[0](func[1])
else:
func[0]()
【问题讨论】:
-
this question 没有帮助怎么办?听起来他们有同样的问题。
-
你可以让你的
__setitem__接受元组,这样你就可以用my_dict[key, 0] = 1代替my_dict[key][0] = 1。然后所有的特殊外壳都在您的dict子类中。当然,这并不妨碍人们采用第一种方式。但是,比较是正确的。您需要保留所有更改的列表的副本。 -
在
my_dict[key][0] = 1,my_dict对任何作业一无所知;该对象所看到的只是key的查找。完成这项工作的唯一方法是让可变对象的每次查找都返回实际对象的包装版本,该版本具有自己的__setitem__()覆盖。 -
当分配给一个可下标值的项目时,你想要调用相同的函数吗?
标签: python python-3.x dictionary observer-pattern