Динамический вызов метода в Python 2.7 с использованием строк имен методов

у меня есть Кортеж, который перечисляет методы класса, такие как:

t = ('methA','methB','methC','methD','methE','methF')

и так далее..

теперь мне нужно динамически вызывать эти методы на основе сделанного пользователем выбора. Методы должны вызываться на основе индекса. Поэтому, если пользователь выбирает "0",methA называется, если '5', methF называется.

мой метод для этого заключается в следующем:

def makeSelection(self, selected):
    #methodname = t[selected]
    #but as this is from  within the class , it has to be appended with 'self.'methodname
    # also need to pass some arguments locally calculated here

мне удалось что-то придумать с eval но он дает ошибку и не находится на все элегантно.

1 ответов


если вы вызываете метод для объекта (включая импортированные модули), вы можете использовать:

getattr(obj, method_name)(*args) #  for this question: use t[i], not method_name

Если вам нужно вызвать функцию в текущем модуле

getattr(sys.modules[__name__], method_name)(*args)

здесь args - это список или кортеж аргументов для отправки, или вы можете просто перечислить их в вызове, как и любую другую функцию. Поскольку вы находитесь в методе, пытающемся вызвать другой метод на том же объекте, используйте первый с self на месте obj

функцией getattr принимает объект и строку, и выполняет поиск атрибута в объекте, возвращая атрибут, если он существует. obj.x и getattr(obj, 'x') достичь того же результата. Есть также setattr, hasattr и delattr функции, если вы хотите выглядеть в этот вид отражения.



полностью альтернативный подход:
Заметив, сколько внимания этот ответ принято, я собираюсь предложить другой подход к тому, что вы делаете. Я предполагаю, что некоторые методы существуют

def methA(*args): print 'hello from methA'
def methB(*args): print 'bonjour de methB'
def methC(*args): print 'hola de methC'

чтобы каждый метод соответствовал номеру (выбору), я создаю словарь, сопоставляющий номера с самими методами

id_to_method = {
    0: methA,
    1: methB,
    2: methC,
}

при этом id_to_method[0]() бы вызвать methA. Это две части, первая -id_to_method[0] который получает объект функции из словаря, затем () это называет. Я также мог бы передать аргумент id_to_method[0]("whatever", "args", "I", "want) В твоей реальности ... код, учитывая вышеизложенное, у вас, вероятно, будет что-то вроде

choice = int(raw_input('Please make a selection'))
id_to_method[choice](arg1, arg2, arg3) # or maybe no arguments, whatever you want