2009-06-17 17 views
6

क्या कक्षा के तरीके को कॉल करने के लिए स्ट्रिंग का उपयोग करने का कोई तरीका है? यहाँ एक उदाहरण है कि उम्मीद है कि बेहतर समझा जाएगा है (वैसे मुझे लगता है कि यह होना चाहिए का उपयोग कर):स्ट्रिंग का उपयोग चर नाम के रूप में

class helloworld(): 
    def world(self): 
     print "Hello World!" 

str = "world" 
hello = helloworld() 

hello.`str`() 

कौन सा होगा उत्पादन Hello World!

अग्रिम धन्यवाद।

+0

उत्पादन होना चाहिए "हैलो दुनिया" या "है हैलो विश्व!"? – Buddy

उत्तर

16

आप getattr उपयोग कर सकते हैं:

>>> class helloworld: 
...  def world(self): 
...   print("Hello World!") 
... 
>>> m = "world" 
>>> hello = helloworld() 
>>> getattr(hello, m)() 
Hello World! 
  • ध्यान रखें कि आपके उदाहरण के रूप में class helloworld() में कोष्ठक, अनावश्यक हैं इस मामले में।
  • और, SilentGhost अंक के रूप में, str एक चर के लिए एक दुर्भाग्यपूर्ण नाम है।
+4

str एक चर नाम के लिए एक खराब विकल्प है। – SilentGhost

-3

एक तरह से तुम सिर्फ डेटा

def thing1(): 
    print "stuff" 

def thing2(): 
    print "other stuff" 

avariable = thing1 
avariable() 
avariable = thing2 
avariable() 

और उत्पादन you'l मिल

stuff 
other stuff 

तो फिर तुम और अधिक जटिल प्राप्त कर सकते हैं और है जैसे कार्यों के बराबर होना चर सेट कर सकते हैं

somedictionary["world"] = world 
somedictionary["anotherfunction"] = anotherfunction 

और इसी तरह। आप स्वचालित रूप से डिक्शनरी उपयोग dir में एक मॉड्यूल तरीकों() संकलित करने के लिए चाहते हैं

+2

ब्ला को कॉल करके आप चीज़ 1 का आउटपुट कैसे प्राप्त कर सकते हैं? –

2

चेतावनी: कार्यकारी, का उपयोग यह

तुम भी में निर्मित समारोह का उपयोग कर सकते उपयोग करने से पहले यह अध्ययन करने के लिए एक खतरनाक कार्य है "कार्यकारी":

>>> def foo(): print('foo was called'); 
... 
>>> some_string = 'foo'; 
>>> exec(some_string + '()'); 
foo was called 
>>> 
+3

वास्तव में एक अच्छा विचार नहीं है। जब संभव हो तो निष्पादन से बचा जाना चाहिए। इस समस्या के लिए Getattr बनाया गया है। – Stephan202

+2

भ्रमित न करें * कैसे * यह * सुरक्षित * है या नहीं। निष्पादन वास्तव में उपयोग करने के लिए एक खतरनाक कार्य है। हालांकि, इसे सुरक्षित रूप से उपयोग करने के तरीके हैं। इस मामले में, आप "सैंडबॉक्स" में निष्पादन चलाने के लिए "ग्लोबल्स" और "स्थानीय" संदर्भ शब्दकोशों को पारित कर सकते हैं। – AgentLiquid

+1

मैंने exec() के बारे में भयानक बातें सुनी हैं, लेकिन यह पूरी तरह से काम किया। –

-3

क्या आप देख रहे हैं exec

class helloworld(): 
    def world(self): 
     print "Hello World!" 

str = "world" 
hello = helloworld() 

completeString = "hello.%s()" % str 

exec(completString) 
+1

जो कि स्पष्ट रूप से गलत है – SilentGhost

+0

मैंने पहले कभी "exec" का उपयोग नहीं किया है, लेकिन मुझे लगता है कि मैं पुनर्विचार करूँगा ... अप-मोडिंग। –

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

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