2010-09-04 5 views
13

में प्रतिनिधि मैंने एक साधारण प्रतिनिधिमंडल पैटर्न का प्रदर्शन करने के लिए इस संक्षिप्त उदाहरण को लागू किया है। मेरा सवाल यह है कि। क्या ऐसा लगता है कि मैंने प्रतिनिधिमंडल को सही समझा है?पायथन

class Handler: 
    def __init__(self, parent = None): 
     self.parent = parent 
    def Handle(self, event): 
     handler = 'Handle_' +event 
     if hasattr(self, handler): 
      func = getattr(self, handler) 
      func() 
     elif self.parent: 
      self.parent.Handle(event) 

class Geo(): 
    def __init__(self, h): 
     self.handler = h 

    def Handle(self, event): 
     func = getattr(self.handler, 'Handle') 
     func(event) 

class Steve(): 
    def __init__(self, h): 
     self.handler = h 

    def Handle(self, event): 
     func = getattr(self.handler, 'Handle') 
     func(event) 

class Andy(): 
    def Handle(self, event): 
     print 'Andy is handling %s' %(event) 

if __name__ == '__main__':   
    a = Andy() 
    s = Steve(a) 
    g = Geo(s) 
    g.Handle('lab on fire') 
+3

आप 'हैंडलर' कक्षा के साथ क्या कर रहे हैं? – Santa

+0

यह एक बड़ा उदाहरण का हिस्सा है, और जब मैं इसे यहां पोस्ट करता हूं तो इससे छुटकारा पाने में भूल गया। – MattyW

+2

उपरोक्त कोड में, आपके जियो, स्टीव और एंडी क्लास में एक हैंडल फ़ंक्शन है जिसमें आप getattr() को कॉल करते हैं। मैं गेटैटर को कॉल करने से पहले हैट्र() के साथ प्रतिनिधि ऑब्जेक्ट में वास्तव में मौजूद फ़ंक्शन की जांच करने की अनुशंसा करता हूं। मैं बस इसे इंगित करना चाहता था क्योंकि यह दुर्घटनाओं का स्रोत हो सकता है। – Ashbay

उत्तर

4

यह मूल अवधारणा है, हाँ - कुछ आने वाले अनुरोध पर कुछ आने वाले अनुरोध पर ध्यान देने के लिए।

11

एक अजगर टिप: आप कहते हैं की जरूरत नहीं है:

func = getattr(self.handler, 'Handle') 
func(event) 

सिर्फ इतना कहना:

self.handler.Handle(event) 

मुझे यकीन है कि क्या आप अपने हैंडलर वर्ग के साथ क्या कर रहे हैं नहीं कर रहा हूँ, यह नहीं ' आपके उदाहरण में प्रयोग नहीं किया जाता है।

और पायथन में, ऊपरी-केस नाम वाले विधियां बहुत ही असामान्य हैं, आमतौर पर कुछ मौजूदा एपीआई को ऐसे नामों के साथ पोर्ट करने का नतीजा होता है।

+1

धन्यवाद नेड, यह कमांड डिस्पैच पैटर्न का उपयोग करके अधिक उदाहरण का हिस्सा है, इसलिए मैं गेटैटर का उपयोग कर रहा हूं, खराब विधि नाम को ध्यान में रखते हुए धन्यवाद, मैं इसे ठीक कर दूंगा – MattyW