28

Birkaç çalışan için Python'da Observable desenini uygulamak istiyorum ve bu yararlı snippet'e rastladım:Python'da geri çağırma gerçekleştirme - geçerli işleve bir çağrılabilir referansı aktarma

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) 

Kaynak: Here

Bunu anladığım kadarıyla subscribe için fire'de çağrılacak işleve bir geri bildirimi iletmesi gerekir. Çağıran işlev bir class yöntemiyse, muhtemelen self kullanmış olabilirdim, ancak bunun yokluğunda - self.callbacks.append(callback) bit'i için yararlı olabilecek bir geri bildirimi doğrudan nasıl alabilirim?

cevap

47

:

def my_callback_func(event): 
    # do stuff 

o = Observable() 
o.subscribe(my_callback_func) 

Diğer örnek kullanımları:

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

Yöntemlerde "öz" argümanı eksik. –

+1

Whoops. Örnek yöntemde unuttum. Statik yöntem bir 'self' almaz. – Amber

+1

Mükemmel, teşekkürler size çok - Eğer geri arama için gözlemlenebilir yönteminden arama yapmak nasıl ben – malangi

İlgili konular