web-dev-qa-db-ja.com

Python-呼び出し可能な参照を現在の関数に渡すことでコールバックを実装する

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)ビット?

32
malangi

定義した関数は、名前を使用するだけで渡すことができます。呼び出しに使用する側に()を追加する必要はありません。

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>>)
55
Amber