2011-09-29 14 views
1

給定一個對象Foo,該對象具有一組Bar,Baz,Quux和Close方法。引用Python函數以便稍後應用

我想調用包裝成富的所以後來如下

def wrapper(method_symbol, *args): 
    object = Foo() 
    apply(object.method_symbol, args) 
    object.Close() 

,我可以打電話wrapper(Bar, MySweetArgs)和有包裝正確地調度。

很明顯,在Lisp中這會很簡單,只需要QUOTE method_symbol就可以了。

目標是以文本高效的方式正確分配/取消分配資源。我不希望將所有的Foo都包含在SafeFoo類中。

+0

什麼是一種「文本高效的時尚」? – mikerobi

+0

@mike:我不想寫很多樣板代碼。 –

+0

@agf:這只是Foo上的一種方法。 –

回答

-1

如果method_symbol是字符串名字,然後

Foo.__dict__[method_symbol](*args) 

可能會做到這一點。

+1

如果是實例方法,則不適用。 – agf

+0

的確,你必須將obj推到參數的開頭,才能充當自我。某人的回答比較好。 –

4

如果你想用它的名字來調用方法時,wrapper功能看起來是這樣的:

def wrapper(method_symbol, *args): 
    obj = Foo() 
    getattr(obj, method_symbol)(*args) 
    obj.Close() 

wrapper('Bar', 1, 2, 3) 

你也可以直接使用的方法,而不是它的名字:

def wrapper(method, *args): 
    obj = Foo() 
    method(obj, *args) 
    obj.Close() 

wrapper(Foo.Bar, 1, 2, 3) 
相關問題