Ответ 1
getattr(obj, "name")(args)
В ruby, если у меня есть объект obj, с помощью метода funcname, я могу вызвать метод, используя следующий синтаксис obj.send(имя_функция)
Есть ли что-то подобное в python.
Причина, по которой я хочу это сделать, что у меня есть оператор switch, где я устанавливаю имя funcname и хочу называть его в конце инструкции switch.
getattr(obj, "name")(args)
hmmm... getattr (obj, funcname) (* args, ** kwargs)?
>>> s = "Abc"
>>> s.upper()
'ABC'
>>> getattr(s, "upper")()
'ABC'
>>> getattr(s, "lower")()
'abc'
Помимо уже упомянутого getattr()
встроенного:
В качестве альтернативы циклу if-elif-else вы можете использовать словарь для сопоставления своих "случаев" с желаемыми функциями/методами:
# given func_a, func_b and func_default already defined
function_dict = {
'a': func_a,
'b': func_b
}
x = 'a'
function_dict(x)() # -> func_a()
function_dict.get('xyzzy', func_default)() # fallback to -> func_c
Относительно методов вместо простых функций:
method_dict
, используя, например, lambda obj: obj.method_a()
вместо function_a
и т.д., а затем выполните method_dict[case](obj)
getattr()
, как уже упоминались другие ответы, но вам это нужно только в том случае, если вам действительно нужно получить метод от его имени.Или, если хотите, operator.methodcaller('foo')
- это функция, которая вызывает foo
на все, что вы передаете. Другими словами,
import operator
fooer = operator.methodcaller("foo")
fooer(bar)
эквивалентно
bar.foo()
(Я думаю, что это, вероятно, сопряженное или двойное в подходящей категории. Если вы математически склонны.)