【发布时间】:2018-06-28 10:36:30
【问题描述】:
这个问题一般不是关于观察者模式的。它专注于在该模式中使用装饰器。该问题基于类似问题的answer。
#!/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 = data
self._broadcast_observers()
class TheGUIElement:
"""
Example of a gui class (Widget) just for demonstration.
e. g. it could be a text field in GUI.
"""
def __init__(self, data):
self._data = data
#data.register_observer(self._data_updated)
self._redraw()
def _redraw(self):
print('in _redraw(): ' + data.data)
@Observable.register_observer
def _data_updated(self, **kwargs):
"""
This is the callback that is called by the Observable if the
data changed.
"""
print('in _data_updated() - kwargs: {}'.format(kwargs))
self._redraw()
if __name__ == '__main__':
data = TheData('DATA')
gui = TheGUIElement(data)
data.data = 'SECOND DATA'
由于此错误,此代码不起作用。
Traceback (most recent call last):
File "./o.py", line 42, in <module>
class TheGUIElement:
File "./o.py", line 55, in TheGUIElement
@Observable.register_observer
TypeError: register_observer() missing 1 required positional argument: 'callback'
我不清楚如何使用装饰器来注册观察者(例如TheGUIElement)。
【问题讨论】:
-
好吧,就像你的错误消息说:“register_observer() 缺少 1 个必需的位置参数'”:当你的装饰器被调用时,它只接收 self._data_updated 作为参数,而不是 self.data。
-
这是因为
@Observable.register_observer在Observable类而不是实例上调用register_observer。
标签: python python-3.x observer-pattern python-decorators