Observable
パターンをPythonで2、3人のワーカーに実装したいのですが、この便利なスニペットに出会いました。
_class Event(object):
pass
class Observable(object):
def __init__(self):
self.callbacks = []
def subscribe(self, callback):
self.callbacks.append(callback)
def fire(self, **attrs):
e = Event()
e.source = self
for k, v in attrs.iteritems():
setattr(e, k, v)
for fn in self.callbacks:
fn(e)
_
ソース: ここ
私が理解しているように、subscribe
を実行するには、fire
で呼び出される関数にコールバックを渡す必要があります。呼び出し関数がclass
メソッドである場合、おそらくself
を使用できたかもしれませんが、これがない場合-self.callbacks.append(callback)
ビット?
定義した関数は、名前を使用するだけで渡すことができます。呼び出しに使用する側に()
を追加する必要はありません。
def my_callback_func(event):
# do stuff
o = Observable()
o.subscribe(my_callback_func)
その他の使用例:
class CallbackHandler(object):
@staticmethod
def static_handler(event):
# do stuff
def instance_handler(self, event):
# do stuff
o = Observable()
# static methods are referenced as <class>.<method>
o.subscribe(CallbackHandler.static_handler)
c = CallbackHandler()
# instance methods are <class instance>.<method>
o.subscribe(c.instance_handler)
# You can even pass lambda functions
o.subscribe(lambda event: <<something involving event>>)