与python中的ruby obj.send等效
在ruby中,如果我有一个对象obj,带有一个名为funcname的方法,我可以使用以下语法调用该方法 对象发送(函数名) python中有类似的东西吗 我之所以要这样做,是因为我有一个switch语句,其中我设置了funcname,并希望在switch语句的末尾调用它与python中的ruby obj.send等效,python,send,Python,Send,在ruby中,如果我有一个对象obj,带有一个名为funcname的方法,我可以使用以下语法调用该方法 对象发送(函数名) python中有类似的东西吗 我之所以要这样做,是因为我有一个switch语句,其中我设置了funcname,并希望在switch语句的末尾调用它 getattr(obj, "name")(args) hmmm。。。getattr(对象,函数名)(*args,**kwargs) 除了前面提到的getattr()builtin之外: 作为if-elif-else循
getattr(obj, "name")(args)
hmmm。。。getattr(对象,函数名)(*args,**kwargs)
除了前面提到的
getattr()
builtin之外:
作为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
关于方法而不是普通函数:
- 您只需使用例如
而不是lambda obj:obj.method\u a()
等将上述示例转换为function\u a
,然后执行method\u dict
method\u dict[case](obj)
- 正如其他答案已经提到的那样,您可以使用
,但只有在确实需要从名称获取方法时才需要它getattr()
- 在某些情况下,stdlib是一个不错的快捷方式:基于方法名和一些可选参数,它创建一个函数,在另一个对象上使用该名称调用该方法(如果在创建methodcaller时提供了任何额外参数,它将使用这些参数调用该方法)
操作符。methodcaller('foo')
是一个函数,它可以对您传递的任何内容调用foo
。换句话说,
import operator
fooer = operator.methodcaller("foo")
fooer(bar)
相当于
bar.foo()
(我认为这可能是一个合适的类别中的伴随或对偶。如果你有数学倾向的话。)Python没有switch语句。此外,在运行时生成函数名几乎总是一个坏主意。@Rafe:这不是通常需要的,但它本身并没有什么坏处。是的,它不是,但我仍然希望在和if-elif-else循环中这样做。我想我得到了下面的答案。您可以始终只分配函数:“f=obj.func”,然后稍后调用
f(args)
。Python的方法绑定在需要的时候很适合这样做。
bar.foo()