2012-07-25 4 views
6

द्वारा कॉल विधियां मेरे पास निम्न श्रेणी है।स्ट्रिंग

func_list= ["function1", "function2", "function3"] 

class doit(object): 
    def __init__(self): 
     for item in func_list: 
      if item == "function1": 
       self.function1() 
      elif item == "function2": 
       self.function2() 
      elif item == "function3": 
       self.function3() 

    def function1(self): 
     #do this 
     pass 
    def function2(self): 
     #do that 
     pass 
    def function3(self): 
     pass 

तो इस वर्ग का एक उदाहरण बन जाता है, यह स्ट्रिंग की एक सूची से अधिक iterates और वास्तविक स्ट्रिंग पर निर्भर करता है तरीकों कहता है। सूची में तारों के संबंधित तरीकों के नाम हैं।

मैं इसे और अधिक सुरुचिपूर्ण तरीके से कैसे कर सकता हूं? मैं सूची में जोड़े गए प्रत्येक "फ़ंक्शन" के लिए एक और elif -path जोड़ना नहीं चाहता हूं।

+3

ध्यान दें, अपनी चर सूची को कॉल न करें, क्योंकि यह एक पायथन अंतर्निहित फ़ंक्शन का नाम है। 'मज़ेदार' या 'फ्लिस्ट' जैसी कुछ ठीक होगी;) – catchmeifyoutry

+0

आपको स्ट्रिंग के बजाए फ़ंक्शन ऑब्जेक्ट्स को सूची में रखना चाहिए, और बस प्रत्येक को कॉल करना चाहिए। – Julian

उत्तर

10
func_list= ["function1", "function2", "function3"] 

class doit(object): 
    def __init__(self): 
     for item in func_list: 
      getattr(self, item)() 
    def function1(self): 
     print "f1" 
    def function2(self): 
     print "f2" 
    def function3(self): 
     print "f3" 



>>> doit() 
f1 
f2 
f3 

भी के लिए निजी कार्यों:

for item in func_list: 
    if item.startswith('__'): 
     getattr(self, '_' + self.__class__.__name__+ item)() 
    else: 
     getattr(self, item)() 

getattr(object, name[, default]) 

ऑब्जेक्ट के नामांकित विशेषता का मान वापस करें। नाम एक स्ट्रिंग होना चाहिए। यदि स्ट्रिंग ऑब्जेक्ट के गुणों में से एक का नाम है, तो परिणाम उस विशेषता का मान है। उदाहरण के लिए, Getattr (x, 'foobar') x.foobar के बराबर है। यदि नामित विशेषता मौजूद नहीं है, तो प्रदान किए जाने पर डिफ़ॉल्ट लौटा दिया जाता है, अन्यथा विशेषता Eror उठाया जाता है।

http://docs.python.org/library/functions.html#getattr

+2

मुझे लगता है कि यह जवाब थोड़ा बेहतर होगा यदि आपने उल्लेख किया कि जादू 'गेटैटर' फ़ंक्शन में किया गया था और दस्तावेज़ों के लिए एक लिंक प्रदान किया गया था। – mgilson

+0

सूची चर से छुटकारा पाने के लिए भी अच्छा होगा, क्योंकि इसका उपयोग नहीं किया जाता है। –

+0

@black_dragon: बढ़िया, यही वह है जो मैं करना चाहता था। लेकिन मैं 'निजी' विधियों जैसे 'def __function4 (self) तक कैसे पहुंचूं: प्रिंट "निजी" '? – wewa

0
class doit(object): 
    def __init__(self, func_list): 
     for func in func_list: 
      func(self) 
    #insert other function definitions here 

func_list = [doit.function1, doit.function2, doit.function3] 
foo = doit(func_list) 
2

यह आमतौर पर एक शब्दकोश देखने के साथ हल किया जाता है, क्योंकि कार्यों अजगर में प्रथम श्रेणी के datatypes हैं। उदाहरण के लिए:

# map string names to callable functions 
dispatch = {'func1': func1, 'func2': func2, ...} 

want_to_call = 'func1' 
dispatch[want_to_call](args) 
-2

आप eval का उपयोग कर सकते हैं जो आपके प्रोग्राम को अधिक सरल और छोटा बनाता है।

list= ["function1", "function2", "function3"] 

class doit(object): 
    def __init__(self): 
     for item in list: 
      eval(item)() 
    def function1(self): 
     print "f1" 
    def function2(self): 
     print "f2" 
    def function3(self): 
      print "f3" 
+0

'exec' का उपयोग करने के लिए एक और संभावना होगी। – wewa

+2

-1, eval और exec ऐसी चीजें हैं जो कभी भी पायथन कोड में दिखाई नहीं देनी चाहिए। वे सुरक्षा भेद्यताएं हैं और यहां पूरी तरह से अधिक है। – Julian

1

आप लैम्बडा का उपयोग क्यों नहीं करते?

इस तरह कहते हैं के रूप में

,

def func1(a): 
    return a ** 2 

def func2(a, b): 
    return a ** 3 + b 

dic = {'Hello':lambda x: func1(x), 'World':lambda x,y: func2(x, y)} #Map functions to lambdas 
print dic['Hello'](3) 
print dic['World'](2,3) 

आउटपुट, 9 11

या, आप यह कर सकते हैं ...

class funs(): 
    def func1(self, a): 
     return a ** 2 

    def func2(self, a, b): 
     return a ** 3 + b 

f = funs() 
dic = {'Hello': lambda x: f.func1(x), 'World': lambda x,y: f.func2(x,y)} 
print dic['Hello'](3) 
print dic['World'](5,4) 

आप देंगे, 9 129

एक के रूप में
संबंधित मुद्दे