在 Ruby 中,如果我有一个名为 obj 的对象,它有一个名为 funcname 的方法,我可以使用以下语法调用该方法:
obj.send(funcname)
在 Python 中是否有类似的东西呢?
我想这么做的原因是,我有一个带有 switch 语句的函数,在其中设置了 funcname,而且希望在 switch 语句结束时调用它。
getattr(obj, "name")(args)
嗯... getattr(obj, funcname)(*args, **kwargs)?
>>> s = "Abc"
>>> s.upper()
'ABC'
>>> getattr(s, "upper")()
'ABC'
>>> getattr(s, "lower")()
'abc'
getattr()
内置函数之外:# 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_a()
代替function_a
等,将上述示例转换为method_dict
,然后执行method_dict[case](obj)
getattr()
,但只有在确实需要通过名称获取方法时才需要它。operator.methodcaller('foo')
是一个函数,它在你传递给它的任何对象上调用 foo
。换句话说,import operator
fooer = operator.methodcaller("foo")
fooer(bar)
等同于
bar.foo()
(如果您倾向于数学)我认为这可能是合适范畴中的伴随或对偶。
f(args)
。当需要时,Python的方法绑定非常有用。 - Glenn Maynard