我希望在 Python 中有一些可观察的集合/序列,让我能够监听更改事件,例如添加新项目或更新项目:
list = ObservableList(['a','b','c'])
list.addChangeListener(lambda new_value: print(new_value))
list.append('a') # => should trigger the attached change listener
data_frame = ObservableDataFrame({'x': [1,2,3], 'y':[10,20,30]})
data_frame.addChangeListener(update_dependent_table_cells) # => allows to only update dependent cells instead of a whole table
Run Code Online (Sandbox Code Playgroud)
答:我发现以下项目提供了可观察集合的实现,并且看起来很有前途:
https://github.com/dimsf/Python-observable-collections
它做了我想要的:
from observablelist import ObservableList
def listHandler(event):
if event.action == 'itemsUpdated':
print event.action + ', old items: ' + str(event.oldItems) + ' new items: ' + str(event.newItems) + ' at index: ' + str(event.index)
elif event.action == 'itemsAdded' or event.action == …Run Code Online (Sandbox Code Playgroud) 这个问题一般与观察者模式无关。它专注于在该模式中使用装饰器。该问题基于类似问题的答案。
#!/usr/bin/env python3
class Observable:
"""
The object that need to be observed. Alternative names are 'Subject'.
In the most cases it is a data object.
"""
def __init__(self):
self._observers = []
def register_observer(self, callback):
self._observers.append(callback)
return callback
def _broadcast_observers(self, *args, **kwargs):
for callback in self._observers:
callback(*args, **kwargs)
class TheData(Observable):
"""
Example of a data class just for demonstration.
"""
def __init__(self, data):
Observable.__init__(self)
self._data = data
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = …Run Code Online (Sandbox Code Playgroud)