28

मैं कार्यकर्ताओं के एक जोड़े के लिए अजगर में Observable पैटर्न लागू करना चाहते हैं, और यह उपयोगी टुकड़ा भर में आया था:पायथन में एक कॉलबैक को लागू - वर्तमान कार्य करने के लिए एक प्रतिदेय संदर्भ गुजर

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) 

स्रोत: Here

जैसा कि मैं इसे समझता हूं, subscribe के लिए, मुझे fire पर कॉल करने के लिए कॉलबैक पास करने की आवश्यकता होगी। यदि कॉलिंग फ़ंक्शन class विधि था, तो शायद मैं self का उपयोग कर सकता था, लेकिन इसकी अनुपस्थिति में - मैं सीधे कॉलबैक कैसे प्राप्त कर सकता हूं जो self.callbacks.append(callback) बिट के लिए उपयोगी हो सकता है?

उत्तर

47

किसी भी परिभाषित समारोह अंत है कि आप इसे लागू करने की का प्रयोग करेंगे पर () जोड़े बिना बस, अपने नाम का उपयोग करके पारित किया जा सकता:

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

विधियों में 'स्वयं' तर्क गुम है। –

+1

हूप्स। उदाहरण विधि पर इसे भूल गए। स्थैतिक विधि को 'स्वयं' नहीं मिलता है। – Amber

+1

ग्रेट, बहुत बहुत धन्यवाद - मैं वास्तव में स्थिर के साथ जुड़ा हुआ था :) – malangi

संबंधित मुद्दे