28

Voglio realizzare il modello Observable in Python per un paio di lavoratori, e sono imbattuto in questa utile frammento:Implementazione di un callback in Python - passando un riferimento richiamabile alla funzione corrente

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) 

Fonte: Here

Come ho capito, al fine di subscribe, avrei bisogno di passare una richiamata alla funzione che verrà chiamata su fire. Se la funzione chiamante era un metodo class, presumibilmente avrei potuto usare self, ma in assenza di questo - come potrei ottenere direttamente una richiamata che può essere utile per il bit self.callbacks.append(callback)?

risposta

47

Qualsiasi funzione definita può essere passato, semplicemente utilizzando il suo nome, senza aggiungere il () sulla fine che si usa per invocarlo:

def my_callback_func(event): 
    # do stuff 

o = Observable() 
o.subscribe(my_callback_func) 

esempio Altri usi:

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>>) 
+1

Manca l'argomento 'self' nei metodi. –

+1

Whoops. Hai dimenticato il metodo di istanza. Il metodo statico non ottiene un "sé". – Amber

+1

Grande, grazie mille - ero alle prese con statico in effetti :) – malangi