在紅寶石,如果我有一個obj對象,用一種稱爲funcname的,我可以使用下面的語法 obj.send調用方法(funcname的)等效紅寶石obj.send在python
是否有類似的東西在python中。
我想這樣做,我有,我設置的funcname的一個switch語句,並希望在switch語句結束調用它的原因。
在紅寶石,如果我有一個obj對象,用一種稱爲funcname的,我可以使用下面的語法 obj.send調用方法(funcname的)等效紅寶石obj.send在python
是否有類似的東西在python中。
我想這樣做,我有,我設置的funcname的一個switch語句,並希望在switch語句結束調用它的原因。
getattr(obj, "name")(args)
嗯... GETATTR(OBJ,funcname的)(*指定參數時,** kwargs)?
>>> s = "Abc"
>>> s.upper()
'ABC'
>>> getattr(s, "upper")()
'ABC'
>>> getattr(s, "lower")()
'abc'
除了已經提到的getattr()
內置:
作爲替代的,如果 - elif的,否則循環,可以使用字典到你的「案件」映射到所需的函數/方法:
# 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()
(我想這大概是在合適的類別中的共軛或雙。如果你愛好數學。)
Python中沒有按」 t有一個switch語句。而且,在運行時生成函數名幾乎總是一個壞主意。 – 2011-03-08 21:53:29
@Rafe:這不是通常需要的,但它本身並沒有什麼壞處。 – 2011-03-08 22:02:01
是的,它不,但我仍然想要和if-elif-else循環。我想我在下面得到了我的答案。 – 2011-03-08 22:02:57