Динамический вызов метода в 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