Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中实现回调-将可调用引用传递给当前函数_Python_Design Patterns_Functional Programming_Callback_Observer Pattern - Fatal编程技术网

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

在Python中实现回调-将可调用引用传递给当前函数,python,design-patterns,functional-programming,callback,observer-pattern,Python,Design Patterns,Functional Programming,Callback,Observer Pattern,我想用Python为几个工作人员实现Observable模式,并遇到了以下有用的片段: class Event(object): pass class Observable(object): def __init__(self): self.callbacks = [] def subscribe(self, callback): self.callbacks.append(callback) def fire(self, **a

我想用Python为几个工作人员实现
Observable
模式,并遇到了以下有用的片段:

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)
资料来源:


据我所知,为了
订阅
,我需要将回调传递给将在
fire
上调用的函数。如果调用函数是一个
方法,我可能会使用
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>>)
类回调处理程序(对象):
@静力学方法
def静态_处理程序(事件):
#做事
def实例_处理程序(自身、事件):
#做事
o=可观察()
#静态方法引用为。
o、 订阅(CallbackHandler.static\u处理程序)
c=CallbackHandler()
#实例方法是。
o、 订阅(c.instance\u处理程序)
#您甚至可以传递lambda函数
o、 订阅(lambda事件:)

方法中缺少
self
参数。哎哟。在实例方法中忘记了它。静态方法没有得到一个
self
。太好了,非常感谢-事实上我一直在努力解决静态:)@Amber,你如何从可观察方法调用回调?假设Observable将方法存储在“callback”变量中-调用的语法是什么?