2011-08-20 25 views
8

आप अपना नाम देकर एक विधि को कैसे कार्यान्वित कर सकते हैं, उसी विधि में एक ही विधि में कहा जाता है जिसे बुलाया जाता है? इस तरह:पायथन वैरिएबल विधि का नाम

class Class1: 
    def __init__(self): 
     pass 
    def func1(self, arg1): 
     # some code 
    def func2(self): 
     function = getattr(sys.modules[__name__], "func1") # apparently this does not work 

कोई सुझाव?

उत्तर

9

कैसे getattr(self, "func1") के बारे में? इसके अलावा, उदाहरण के लिए नाम समारोह

उपयोग करने से बचें:

>>> class C: 
... def f1(self, arg1): print arg1 
... def f2(self): return getattr(self, "f1") 
... 
>>> x=C() 
>>> x.f2()(1) 
1 
+0

यदि आप चाहते हैं कि विधि को जानते हैं तो 'getattr' का उपयोग करने का कोई कारण नहीं है - बस इसे पकड़ो। –

5

आप वर्ग, नहीं मॉड्यूल से विशेषता मिलना चाहिए।

def func2(self): 
    method = getattr(self, "func1") 
    method("arg") 

लेकिन आपको यह भी जांचना चाहिए कि यह कॉल करने योग्य है।

if callable(method): 
    method("arg") 

इससे कुछ ऐसा कॉल करने से बचने के लिए जो आपको उम्मीद नहीं थी। यदि आप कॉल करने योग्य नहीं हैं तो आप यहां अपना अपवाद उठाना चाहेंगे।

+0

धन्यवाद यह काम कर रहा है – Shaokan

+0

'getattr' अनावश्यक है जब आप विधि का नाम जानते हैं। इसके अलावा, जांचें कि यह कॉल करने योग्य है या नहीं? या तो यह है (और यह होना चाहिए कि यह एक विधि है), या यह एक अपवाद उठाएगा - जो किसी त्रुटि से निपटने का सही तरीका है। –

+2

@ ईथन संभवतः नाम वास्तव में एक चर होगा, और यह सिर्फ एक उदाहरण है। कॉल करने योग्य चेक कोड की एक पंक्ति में त्रुटियों से बचाता है, और इरादा स्पष्ट है, क्योंकि गेटैटर किसी भी प्रकार की विशेषता वापस कर सकता है न कि केवल विधियों। – Keith

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