2013-02-13 96 views
9

मैं एक अजगर वर्ग है कि एक सूची इंटरफेस कहते हैं में एक समारोह है। क्योंकि एक वर्ग बस अपना इंटरफेस, हड़पने इस वस्तु कहा से विरासत है, और सभी अद्यतन के लिए खुद को रजिस्टर करने के लिए की जरूरत हैपायथन में फ़ंक्शन पैरामीटर प्रकार को फोर्स करें?

def RegisterAsListener(self, inListener): 
    self.__TransitListeners.append(inListener) 

यह अच्छा है।

class ITransit(): 
    def TransitUpdate(self, data): 
     raise NotImplementedError("You must define this function.") 

(यह मानते हुए कि मैं एक अंतरफलक सही ढंग से बना)

के बाद से मैं इस परियोजना पर केवल एक ही नहीं कर रहा हूँ, मैं किसी को किसी गलत डेटा प्रकार के साथ RegisterAsListener फ़ंक्शन को कॉल नहीं करना चाहती। मैं पंजीकरण फ़ंक्शन के भीतर प्रकार की जांच करने के लिए कोड डाल सकता हूं, लेकिन यह तब आसान होगा जब संकलक प्रोग्रामर पर चिल्लाएंगे जब वे गलत डेटा प्रकार में फेंकने का प्रयास करेंगे।

def RegisterAsListener(self, IListener inListener): 
    self.__TransitListeners.append(inListener) 

क्या ऐसा करने का कोई तरीका है?

+12

'अगर संकलक बस प्रोग्रामर पर चिल्लाया '... क्या कंपाइलर? – Abhijit

+2

परिभाषित करने के लिए 'abc' मॉड्यूल का उपयोग करें कि इसके बजाय किसी ऑब्जेक्ट को किस प्रकार कार्यान्वित किया जाना चाहिए। –

+0

अन्यथा, पायथन एक * गतिशील रूप से टाइप की गई * भाषा है, यह * आपके लिए ऑब्जेक्ट प्रकारों को लागू नहीं करता है। –

उत्तर

6

हालांकि मैं दृढ़ता से यह करने की सिफारिश नहीं करता हूं और केवल सार बेस क्लासेस (http://docs.python.org/2/library/abc.html) का उपयोग करके कुछ विधियों के कार्यान्वयन को लागू करता हूं, यह संभव है।

यहाँ कैसे ऐसा कुछ करने के लिए पर एक उदाहरण है: http://www.artima.com/weblogs/viewpost.jsp?thread=101605

# mm.py 
registry = {}                 

class MultiMethod(object):              
    def __init__(self, name):             
     self.name = name               
     self.typemap = {}              
    def __call__(self, *args):             
     types = tuple(arg.__class__ for arg in args) # a generator expression! 
     function = self.typemap.get(types)          
     if function is None:              
      raise TypeError("no match")           
     return function(*args)             
    def register(self, types, function):           
     if types in self.typemap:            
      raise TypeError("duplicate registration")       
     self.typemap[types] = function           

def multimethod(*types):               
    def register(function):              
     function = getattr(function, "__lastreg__", function)     
     name = function.__name__             
     mm = registry.get(name)             
     if mm is None:               
      mm = registry[name] = MultiMethod(name)        
     mm.register(types, function)            
     mm.__lastreg__ = function            
     return mm                
    return register                

    if hasattr(function, "__lastreg__"):           
     function = function.__lastreg__ 

और कोड का उपयोग कर:

import mm                  

@mm.multimethod(int)                
def spam(a):                  
    print 'Calling the int method'            
    print '%s: %r' % (type(a), a)            

@mm.multimethod(float)               
def spam(a):                  
    print 'Calling the float method'            
    print '%s: %r' % (type(a), a)            

spam(5)                   
spam(5.0) 

उदाहरण आउटपुट:

Calling the int method 
<type 'int'>: 5 
Calling the float method 
<type 'float'>: 5.0 
7

के बाद से मैं इस परियोजना पर केवल एक ही नहीं कर रहा हूँ, मैं नहीं चाहता कि किसी को चाहते एक गलत डेटा प्रकार

दस्तावेज़ समारोह के साथ RegisterAsListener समारोह बुला अच्छी तरह से है, तो गलत मापदंडों फेंक देना अपवाद नहीं। RegisterAListener के उपयोगकर्ता प्रलेखन उपयोग करने के लिए पता है कि जिस प्रकार का डेटा समारोह की उम्मीद में सक्षम होना चाहिए, और - अगर दिए गए गलत मापदंडों - जिसके परिणामस्वरूप अपवाद यह स्पष्ट RegisterAListener के उपयोगकर्ता गलत क्या किया बनाना चाहिए।

+1

दस्तावेज़ीकरण के साथ एक उचित बिंदु, बेहतर मार्ग हो सकता है। – MintyAnt

+3

आप विचार कर सकते हैं [अजगर व्याख्या] (http://www.python.org/dev/peps/pep-3107/) स्वयं दस्तावेज के एक प्रकार के रूप प्रलेखन के हिस्से के रूप। – kojiro