28

Chcę zaimplementować wzorzec Observable w Pythonie dla kilku pracowników, i natknąłem się na to pomocny fragmencie:Wdrożenie zwrotnego w Pythonie - przepuszczanie wpłacone odniesienie do aktualnej funkcji

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) 

Źródło: Here

Jak rozumiem, w celu subscribe, musiałbym przekazać wywołanie zwrotne do funkcji, która będzie wywoływana na fire. Gdyby funkcja wywołująca była metodą class, prawdopodobnie mógłbym użyć self, ale w przypadku braku tego - w jaki sposób mógłbym uzyskać wywołanie zwrotne, które może być przydatne dla bitów self.callbacks.append(callback)?

Odpowiedz

47

Każda zdefiniowana funkcja może być przekazywana po prostu za pomocą jego nazwy, bez dodawania () na końcu, które można wykorzystać, aby ją wywołać:

def my_callback_func(event): 
    # do stuff 

o = Observable() 
o.subscribe(my_callback_func) 

Inne przykładowe uruchomień:

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

Brakujący argument "self" w metodach. –

+1

Whoops. Zapomniałem o tym w metodzie instancji. Metoda statyczna nie otrzymuje "self". – Amber

+1

Świetnie, dziękuję bardzo - walczyłem ze statyczną w rzeczywistości :) – malangi

Powiązane problemy