बस जानना चाहते हैं कि पाइथन में घटनाओं पर प्रतिक्रिया करने का आम तरीका क्या है। कॉलबैक फ़ंक्शंस, प्रतिनिधियों, श्रोता-संरचनाओं आदि जैसे अन्य भाषाओं में कई तरीके हैं। क्या कोई आम तरीका है? कौन सी डिफ़ॉल्ट भाषा अवधारणाएं या अतिरिक्त मॉड्यूल हैं और आप किसकी सिफारिश कर सकते हैं?पायथन: कॉलबैक, प्रतिनिधि, ...? आम क्या है?
उत्तर
व्यक्तिगत रूप से, मैंने केवल कॉलबैक का उपयोग किया है। हालांकि, मैंने उस घटना को संचालित पायथन कोड नहीं देखा है ताकि वाईएमएमवी।
मैं आम दृष्टिकोणों के लिए बात नहीं कर सकता, लेकिन this page (वास्तविक प्रति अनुपलब्ध है) मुझे पसंद करने वाले पर्यवेक्षक पैटर्न का कार्यान्वयन है। http://web.archive.org/web/20060612061259/http://www.suttoncourtenay.org.uk/duncan/accu/pythonpatterns.html
मैंने देखा है श्रोताओं और कॉलबैक प्रयोग किया है:
यहाँ इंटरनेट पुरालेख लिंक भी है। लेकिन AFAIK कोई पायथन रास्ता नहीं है। यदि प्रश्न में आवेदन उपयुक्त है तो उन्हें समान रूप से व्यवहार्य होना चाहिए।
व्यक्तिगत रूप से मुझे कॉलबैक, श्रोताओं और प्रतिनिधियों के बीच कोई अंतर दिखाई नहीं देता है।
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)
यह सब आपके आवेदन की जटिलता के स्तर पर निर्भर करता है। सरल घटनाओं के लिए, कॉलबैक शायद करेंगे। अधिक जटिल पैटर्न और decoupled स्तरों के लिए आपको किसी प्रकार के प्रकाशन-सदस्यता क्रियान्वयन का उपयोग करना चाहिए, जैसे कि PyDispatcher या WxPython के पबब।
this discussion भी देखें।
अधिकांश पायथन लाइब्रेरीज़ मैंने अपने ईवेंट नोटिफिकेशन के लिए कॉलबैक मॉडल लागू किया है, जो मुझे लगता है कि भाषा काफी अच्छी तरह से उपयुक्त है। PygtkGObject से सभी ऑब्जेक्ट्स प्राप्त करके ऐसा करता है, जो कॉलबैक-आधारित सिग्नल हैंडलिंग लागू करता है। (हालांकि यह अंतर्निहित सी जीटीके कार्यान्वयन की एक विशेषता है, भाषा से प्रेरित कुछ नहीं।) हालांकि, Pygtkmvc पायगेट के शीर्ष पर एक पर्यवेक्षक पैटर्न (और एमवीसी) को लागू करने का एक दिलचस्प काम करता है। यह एक बहुत अलंकृत मेटाक्लास आधारित कार्यान्वयन का उपयोग करता है, लेकिन मुझे पता चला है कि यह ज्यादातर मामलों के लिए काफी अच्छी तरह से काम करता है। कोड का पालन करने के लिए उचित रूप से सरल है, साथ ही, यदि आप एक ऐसा तरीका देखने में रुचि रखते हैं जिसमें यह किया गया है।
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 से कॉपी-पेस्ट करें।
मैं पंजीकरण और पाइथन में घटनाओं को संभालने के लिए एक कार्यान्वयन की तलाश में हूं। मेरा एकमात्र अनुभव Gobject के साथ है, लेकिन इसका उपयोग केवल पीईजीटीके के साथ किया गया है। यह लचीला है, लेकिन कुछ उपयोगकर्ताओं के लिए अत्यधिक जटिल हो सकता है। मैं कुछ अन्य दिलचस्प उम्मीदवारों के साथ भी आया हूं, लेकिन यह स्पष्ट नहीं है कि वे एक दूसरे से तुलना कैसे करते हैं।
- Pyevent, libevent के आसपास एक रैपर।
- Zope Event
- 1. समानांतर पायथन: कॉलबैक क्या है?
- 2. मैं एक प्रतिनिधि कॉलबैक
- 3. आम लिस्प में प्रतिनिधि राज्य स्थानांतरण (आरईएसटी)
- 4. क्या प्रतिनिधि और कॉलबैक समान या समान हैं?
- 5. ड्रॉपबॉक्स एसडीके - लिंकफ्रॉम नियंत्रक: प्रतिनिधि या कॉलबैक?
- 6. पायथन में enums के लिए आम अभ्यास क्या है?
- 7. क्या कोई बेहतर तरीका है? प्रतिनिधि -> प्रतिनिधि -> प्रतिनिधि
- 8. पायथन टाइमर कॉलबैक विधि
- 9. आर समारोह प्रतिनिधि() पायथन में
- 10. क्या 'कॉलबैक' तैयार है?
- 11. आईफोन में प्रतिनिधि क्या है?
- 12. पायथन सीटीपीएस कॉलबैक फ़ंक्शन SWIG
- 13. पायथन एसिंक्रोनस कॉलबैक और जनरेटर
- 14. क्या प्रतिनिधि पैरामीटर के रूप में प्रतिनिधि होना संभव है?
- 15. अप्रबंधित कॉलबैक के प्रतिनिधि में अपवाद फेंकने के प्रभाव
- 16. प्रतिनिधि और प्रतिनिधि तरीके क्या हैं
- 17. आरपीसी कॉलबैक थ्रेड क्या है?
- 18. jQuery: "वैल्यू कॉलबैक" क्या है?
- 19. क्या सबसे आम एल्गोरिदम का अवलोकन है?
- 20. क्या कोई आम "बुरी शब्द" सूची है?
- 21. हुक और कॉलबैक के बीच क्या अंतर है?
- 22. कॉलबैक
- 23. क्या प्रतिनिधि संपत्ति घोषणा
- 24. आम आर idioms
- 25. प्रतिनिधि उदाहरण और विधि सूचक के बीच क्या अंतर है?
- 26. क्या NSRLConnection अपने प्रतिनिधि को बनाए रखता है?
- 27. एक प्रतिनिधि क्या इंगित करता है?
- 28. घटनाक्रम और प्रतिनिधि। डिजाइन पैटर्न क्या है?
- 29. प्रतिनिधि बनाम प्रतिनिधि कीवर्ड
- 30. सी # + कॉलबैक
अच्छा उदाहरण है, लेकिन क्या '__call__' आप का उल्लेख के बारे में है, यह 'foo.add_bar_observer (प्रतिदेय)' रजिस्टर करने के लिए अनुमति देता है? – Kevin
@ केविन - '__call__' के साथ एक उदाहरण जोड़ा गया। आप http://docs.python.org/reference/datamodel.html – orip
पर इसके बारे में और अधिक पढ़ सकते हैं (मुझे लगता है कि आपके अपडेट में कोई गलती है, 'कुछ कॉल करने योग्य()' को 'कुछ कॉल करने योग्य' पढ़ना चाहिए (मुझे यकीन है कि इसे स्वयं ठीक करने के लिए पर्याप्त नहीं है, यदि आवश्यक हो तो मैं टिप्पणी हटा दूंगा) – Kevin