2013-05-20 14 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 

błąd, który pojawia się: TypeError: „str” obiektu nie jest wpłaconeJak dynamicznie wywołać metody klasy przy użyciu metody-name przypisanie do zmiennej

Czy ktoś proszę mi pomóc z tym. Próbowałem wielu permutacji i kombinacji, ale bez skutku! (Uwaga: 'self.func_name' też nie działa)

+2

zależności od użytkowania, może być lepiej, albo z listy/dict funkcji lub przy użyciu funkcji lambda przekazuje dodatkowy argument do funkcji (ten drugi jest głównie przydatny w przypadku wywołań zwrotnych). – sapi

+0

To nie jest kod, którego dotyczy ten błąd. kiedy robisz 'self.func_name', nie masz dostępu do lokalnej zmiennej' func_name'. Próbujesz uzyskać dostęp do zmiennej instancji o nazwie 'nazwa klasy' wewnątrz' self' - ale taka zmienna nie istnieje. – Elazar

+0

@Elazar tak, mój błąd. Przetłumaczyłem kod i tęskniłem za tym. –

Odpowiedz

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

Wielkie dzięki za odpowiedź. Tylko dla wszystkich informacji, możesz również podać wartość domyślną, aby uniknąć wyjątku. np. "func = getattr (self, func_name, None)". From python help (= help (getattr)): "Kiedy podany jest domyślny argument, jest on zwracany, gdy atrybut nie istnieje, bez niego w takim przypadku jest zgłaszany wyjątek." –

2

dwie rzeczy:

  1. W linii 8 użytkowania

    FUNC_NAME = 'funkcji' + str (self.i)

  2. Definiowanie ciąg jako funkcji odwzorowania,

    self.func_options = {'function1': self.function1, 
             'function2': self.function2 
             } 
    
  3. Tak powinno to wyglądać tak:

    class MojaKlasa:

    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

powinno to również działać. ale rozwiązanie getattr to bardzo czyste rozwiązanie, z którego wszyscy możemy skorzystać. Jeszcze raz dziękuję Sinhayash za to nowatorskie rozwiązanie. Może być przydatne rozwiązanie jakiegoś innego pokrewnego problemu. dzięki. –

Powiązane problemy