I want to implement the Observable
pattern in Python for a couple of workers, and came across this helpful snippet:
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)
Source: Here
As i understand it, in order to subscribe
, I would need to pass a callback to the function that is going to be called on fire
. If the calling function was a class
method, presumably I could have used self
, but in the absence of this - how could I directly get a callback that can be useful for the self.callbacks.append(callback)
bit?
Any defined function can be passed by simply using its name, without adding the ()
on the end that you would use to invoke it:
def my_callback_func(event):
# do stuff
o = Observable()
o.subscribe(my_callback_func)
Other example usages:
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>>)