2009-01-14 11 views
22

बस जानना चाहते हैं कि पाइथन में घटनाओं पर प्रतिक्रिया करने का आम तरीका क्या है। कॉलबैक फ़ंक्शंस, प्रतिनिधियों, श्रोता-संरचनाओं आदि जैसे अन्य भाषाओं में कई तरीके हैं। क्या कोई आम तरीका है? कौन सी डिफ़ॉल्ट भाषा अवधारणाएं या अतिरिक्त मॉड्यूल हैं और आप किसकी सिफारिश कर सकते हैं?पायथन: कॉलबैक, प्रतिनिधि, ...? आम क्या है?

उत्तर

0

व्यक्तिगत रूप से, मैंने केवल कॉलबैक का उपयोग किया है। हालांकि, मैंने उस घटना को संचालित पायथन कोड नहीं देखा है ताकि वाईएमएमवी।

2

मैं आम दृष्टिकोणों के लिए बात नहीं कर सकता, लेकिन this page (वास्तविक प्रति अनुपलब्ध है) मुझे पसंद करने वाले पर्यवेक्षक पैटर्न का कार्यान्वयन है। http://web.archive.org/web/20060612061259/http://www.suttoncourtenay.org.uk/duncan/accu/pythonpatterns.html

0

मैंने देखा है श्रोताओं और कॉलबैक प्रयोग किया है:

यहाँ इंटरनेट पुरालेख लिंक भी है। लेकिन AFAIK कोई पायथन रास्ता नहीं है। यदि प्रश्न में आवेदन उपयुक्त है तो उन्हें समान रूप से व्यवहार्य होना चाहिए।

17

व्यक्तिगत रूप से मुझे कॉलबैक, श्रोताओं और प्रतिनिधियों के बीच कोई अंतर दिखाई नहीं देता है।

observer pattern (ए.के.ए. श्रोताओं, ए.के.ए. "एकाधिक कॉलबैक") को कार्यान्वित करना आसान है - बस पर्यवेक्षकों की एक सूची रखें, और इससे कॉलबेल जोड़ें या हटाएं। ये कॉलबेल __call__ जादू विधि के साथ फ़ंक्शन, बाध्य विधियां या कक्षाएं हो सकती हैं। आपको बस इतना करना है कि आप इन इंटरफेस को परिभाषित करें - उदाहरण के लिए क्या वे कोई पैरामीटर प्राप्त करते हैं।

class Foo(object): 
    def __init__(self): 
    self._bar_observers = [] 

    def add_bar_observer(self, observer): 
    self._bar_observers.append(observer) 

    def notify_bar(self, param): 
    for observer in self._bar_observers: 
     observer(param) 

def observer(param): 
    print "observer(%s)" % param 

class Baz(object): 
    def observer(self, param): 
    print "Baz.observer(%s)" % param 

class CallableClass(object): 
    def __call__(self, param): 
    print "CallableClass.__call__(%s)" % param 

baz = Baz() 

foo = Foo() 

foo.add_bar_observer(observer) # function 
foo.add_bar_observer(baz.observer) # bound method 
foo.add_bar_observer(CallableClass()) # callable instance 

foo.notify_bar(3) 
+0

अच्छा उदाहरण है, लेकिन क्या '__call__' आप का उल्लेख के बारे में है, यह 'foo.add_bar_observer (प्रतिदेय)' रजिस्टर करने के लिए अनुमति देता है? – Kevin

+0

@ केविन - '__call__' के साथ एक उदाहरण जोड़ा गया। आप http://docs.python.org/reference/datamodel.html – orip

+0

पर इसके बारे में और अधिक पढ़ सकते हैं (मुझे लगता है कि आपके अपडेट में कोई गलती है, 'कुछ कॉल करने योग्य()' को 'कुछ कॉल करने योग्य' पढ़ना चाहिए (मुझे यकीन है कि इसे स्वयं ठीक करने के लिए पर्याप्त नहीं है, यदि आवश्यक हो तो मैं टिप्पणी हटा दूंगा) – Kevin

1

यह सब आपके आवेदन की जटिलता के स्तर पर निर्भर करता है। सरल घटनाओं के लिए, कॉलबैक शायद करेंगे। अधिक जटिल पैटर्न और decoupled स्तरों के लिए आपको किसी प्रकार के प्रकाशन-सदस्यता क्रियान्वयन का उपयोग करना चाहिए, जैसे कि PyDispatcher या WxPython के पबब।

this discussion भी देखें।

1

अधिकांश पायथन लाइब्रेरीज़ मैंने अपने ईवेंट नोटिफिकेशन के लिए कॉलबैक मॉडल लागू किया है, जो मुझे लगता है कि भाषा काफी अच्छी तरह से उपयुक्त है। PygtkGObject से सभी ऑब्जेक्ट्स प्राप्त करके ऐसा करता है, जो कॉलबैक-आधारित सिग्नल हैंडलिंग लागू करता है। (हालांकि यह अंतर्निहित सी जीटीके कार्यान्वयन की एक विशेषता है, भाषा से प्रेरित कुछ नहीं।) हालांकि, Pygtkmvc पायगेट के शीर्ष पर एक पर्यवेक्षक पैटर्न (और एमवीसी) को लागू करने का एक दिलचस्प काम करता है। यह एक बहुत अलंकृत मेटाक्लास आधारित कार्यान्वयन का उपयोग करता है, लेकिन मुझे पता चला है कि यह ज्यादातर मामलों के लिए काफी अच्छी तरह से काम करता है। कोड का पालन करने के लिए उचित रूप से सरल है, साथ ही, यदि आप एक ऐसा तरीका देखने में रुचि रखते हैं जिसमें यह किया गया है।

0

matplotlib.cbook मॉड्यूल में एक वर्ग CallbackRegistry है जो आप देखना चाहते हैं। documentation से:

 
Handle registering and disconnecting for a set of signals and 
callbacks: 

    signals = 'eat', 'drink', 'be merry' 

    def oneat(x): 
     print 'eat', x 

    def ondrink(x): 
     print 'drink', x 

    callbacks = CallbackRegistry(signals) 

    ideat = callbacks.connect('eat', oneat) 
    iddrink = callbacks.connect('drink', ondrink) 

    #tmp = callbacks.connect('drunk', ondrink) # this will raise a ValueError 

    callbacks.process('drink', 123) # will call oneat 
    callbacks.process('eat', 456)  # will call ondrink 
    callbacks.process('be merry', 456) # nothing will be called 
    callbacks.disconnect(ideat)  # disconnect oneat 
    callbacks.process('eat', 456)  # nothing will be called 

आप शायद matplotlib पैकेज के लिए एक निर्भरता नहीं करना चाहती। मेरा सुझाव है कि आप कक्षा को अपने मॉड्यूल में source code से कॉपी-पेस्ट करें।

0

मैं पंजीकरण और पाइथन में घटनाओं को संभालने के लिए एक कार्यान्वयन की तलाश में हूं। मेरा एकमात्र अनुभव Gobject के साथ है, लेकिन इसका उपयोग केवल पीईजीटीके के साथ किया गया है। यह लचीला है, लेकिन कुछ उपयोगकर्ताओं के लिए अत्यधिक जटिल हो सकता है। मैं कुछ अन्य दिलचस्प उम्मीदवारों के साथ भी आया हूं, लेकिन यह स्पष्ट नहीं है कि वे एक दूसरे से तुलना कैसे करते हैं।

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