Как я могу вызвать метод по имени строки, используя python? - PullRequest
0 голосов
/ 28 мая 2010

У меня есть следующий класс;

class myStringMethod():
    def __init__(self):
        self.func_list= [('func1','print_func1()'),('func2','print_func2()')]

    def print_func1(self, name):
        print name

    def print_func2(self, name):
        print name

    def call_func_by_name(self):
        for func in self.func_list:
            getattr(self, func[1])('Func Name')

if __name__=='__main__':
    strM = myStringMethod()
    strM.call_func_by_name() #Nothing prints out!

Нет вызова функций, что мне не хватает?

Гаф

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

ваш self.func_list должен быть:

self.func_list= [('func1','print_func1'),('func2','print_func2')]

И то, как написан ваш код, будет, конечно, печатать 'Func Name'. Я полагаю, вы, вероятно, хотели передать туда func[0].

Рабочий пример:

>>> class myStringMethod():
    def __init__(self):
        self.func_list= [('func1','print_func1'),('func2','print_func2')]

    def print_func1(self, name):
        print(name)

    def print_func2(self, name):
        print(name)

    def call_func_by_name(self):
        for func in self.func_list:
            getattr(self, func[1])('Func Name')

>>> myStringMethod().call_func_by_name()
Func Name
Func Name
0 голосов
/ 29 мая 2010

может быть оффтоп, но, возможно, ваш список на самом деле является диктатом:

self.functs = {'func1':'print_func1', ...}

, а затем позвоните с:

for fn in self.functs.values() : self.__dict__[fn]('Func Name')

или даже если вы хотите вызвать все функции func_ в вашем классе (здесь нет func_list):

@classmethod
def call_func_by_name(cls)
  for n,f in cls.__dict__.values() : 
     if n.startswith('print_') and hasattr(f,'__call__'): f('Hello')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...