Implémenter un callback en Python-passer une référence callable à la fonction courante

je veux implémenter le modèle Observable en Python pour un couple d'ouvriers, et je suis tombé sur cet extrait utile:

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: Ici

si je comprends bien, pour subscribe , je devrais passer un appel à la fonction qui va être appelée fire . Si la fonction d'appel était une méthode class , probablement j'aurais pu utiliser self , mais en l'absence - comment pourrais-je obtenir directement un rappel qui peut être utile pour la self.callbacks.append(callback) peu?

29
demandé sur Community 2011-01-14 13:15:20

1 réponses

n'importe quelle fonction définie peut être passée en utilisant simplement son nom, sans ajouter le () à la fin que vous utiliseriez pour l'invoquer:

def my_callback_func(event):
    # do stuff

o = Observable()
o.subscribe(my_callback_func)

autres usages d'exemple:

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>>)
48
répondu Amber 2011-01-14 10:41:07