在Python中实现回调 - 将可调用的引用传递给当前函数

mal*_*ngi 32 python design-patterns functional-programming callback observer-pattern

我想Observable在Python中为几个工作者实现模式,并遇到了这个有用的片段:

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)
Run Code Online (Sandbox Code Playgroud)

来源:这里

据我所知,为了这个subscribe,我需要将回调函数传递给将被调用的函数fire.如果调用函数是一个class方法,大概我可以使用self,但在没有这个的情况下 - 我怎么能直接得到一个对该self.callbacks.append(callback)位有用的回调?

Amb*_*ber 55

任何已定义的函数都可以通过简单地使用其名称来传递,而无需添加()用于调用它的末尾:

def my_callback_func(event):
    # do stuff

o = Observable()
o.subscribe(my_callback_func)
Run Code Online (Sandbox Code Playgroud)

其他示例用法:

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>>)
Run Code Online (Sandbox Code Playgroud)