2013-05-20 29 views
13
class MyClass: 

    def __init__(self, i): 
      self.i = i 

    def get(self): 
      func_name = 'function' + self.i 
      self.func_name() # <-- this does NOT work. 

    def function1(self): 
      //do something 

    def function2(self): 
      //do something 

錯誤,我得到的動態調用類中的方法: 類型錯誤:「海峽」對象不是可調用如何使用方法名賦值給變量

可能有人請這方面的幫助。我嘗試了很多排列和組合,但無濟於事! (注: 'self.func_name' 也不起作用)

+2

根據您的使用,你可能會用的功能,無論是列表/字典,或使用拉姆達功能更好傳遞函數的附加參數(後者主要用於回調)。 – sapi

+0

這不是你得到這個錯誤的代碼。當你做'self.func_name'時,你甚至不訪問本地變量'func_name'。你正試圖訪問'self'內的一個名爲'class name'的實例變量 - 但是這個變量不存在。 – Elazar

+0

@Elazar是我的錯誤。我正在翻譯代碼,錯過了這一個。 –

回答

23
def get(self): 
     def func_not_found(): # just in case we dont have the function 
     print "No Function "+self.i+" Found!" 
     func_name = 'function' + self.i 
     func = getattr(self,func_name,func_not_found) 
     func() # <-- this should work! 
+0

非常感謝您的回覆。只是爲了每個人的信息,你也可以給出一個默認值以避免異常。例如'func = getattr(self,func_name,None)'。從python幫助(= help(getattr)):「當給定默認參數時,在屬性不存在時返回;如果沒有它,則在此情況下引發異常。 –

2

兩件事情:

  1. 在第8行使用,

    FUNC_NAME = '功能' + STR(self.i )

  2. 定義的字符串的功能映射爲,

    self.func_options = {'function1': self.function1, 
             'function2': self.function2 
             } 
    
  3. 因此,它應該是看:

    MyClass類:

    def __init__(self, i): 
         self.i = i 
         self.func_options = {'function1': self.function1, 
              'function2': self.function2 
              } 
    def get(self): 
         func_name = 'function' + str(self.i) 
         func = self.func_options[func_name] 
         func() # <-- this does NOT work. 
    
    def function1(self): 
         //do something 
    
    def function2(self): 
         //do something 
    
+0

這應該也適用。但getattr解決方案是我們都可以使用的非常乾淨的解決方案。再次感謝Sinhayash提供這種新穎的解決方案。解決一些其他相關問題可能很有用。謝謝。 –