2011-03-08 83 views
10

在紅寶石,如果我有一個obj對象,用一種稱爲funcname的,我可以使用下面的語法 obj.send調用方法(funcname的)等效紅寶石obj.send在python

是否有類似的東西在python中。

我想這樣做,我有,我設置的funcname的一個switch語句,並希望在switch語句結束調用它的原因。

+2

Python中沒有按」 t有一個switch語句。而且,在運行時生成函數名幾乎總是一個壞主意。 – 2011-03-08 21:53:29

+1

@Rafe:這不是通常需要的,但它本身並沒有什麼壞處。 – 2011-03-08 22:02:01

+0

是的,它不,但我仍然想要和if-elif-else循環。我想我在下面得到了我的答案。 – 2011-03-08 22:02:57

回答

19
getattr(obj, "name")(args) 

9

嗯... GETATTR(OBJ,funcname的)(*指定參數時,** kwargs)?

>>> s = "Abc" 

>>> s.upper() 
'ABC' 

>>> getattr(s, "upper")() 
'ABC' 

>>> getattr(s, "lower")() 
'abc' 
1

除了已經提到的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 

關於方法,而不是簡單的功能:

  • 你可以把上面的é xample爲method_dict使用例如lambda obj: obj.method_a()而不是function_a等,然後做method_dict[case](obj)
  • 你可以使用getattr()其他答案已經提到過,但你只需要它,如果你真的需要從它的名字的方法。
  • operator.methodcaller()從STDLIB在某些情況下,一個很好的快捷方式:基於一個方法的名稱,以及可選的一些參數,它會創建一個叫這個名字的方法在另一個對象的函數(如果你提供的任何額外的參數創建時在methodcaller,它會調用這些參數的方法)
1

或者,如果你願意的話,operator.methodcaller('foo')是在不管你通過它調用foo的功能。換句話說,

import operator 
fooer = operator.methodcaller("foo") 
fooer(bar) 

相當於

bar.foo() 

(我想這大概是在合適的類別中的共軛或雙。如果你愛好數學。)