2012-05-14 38 views
2

我在函數中傳遞方法時遇到問題。我已經看過這篇以前的文章。在python中傳遞方法

How do I pass a method as a parameter in Python

這裏是什麼,我試過一個簡單的例子。

def passMethod(obj, method): 
    return obj.method() 

passMethod('Hi', lower) 

最後我會用它來幫助編寫一個處理GIS(地理信息系統)數據的函數。數據就像一個數組。我想將一個新的列NAME1添加到數組中。數組然後有一個方法來調用列array.NAME1。

問候, 亞歷

+0

您是否熟悉'map'?也許有一點'__iter__'? – cheeken

+0

我不知道你爲什麼要以這種方式傳遞一個方法(儘管有合法的用例,爲什麼你希望這會很好)。如果你對python不熟悉,你可能沒有意識到你可以繞過''Hi'.lower'。這會給你一個返回''hi''的可調用對象。 – Darthfett

+0

@Darthfett我試圖在最後一段提供一些上下文;但在抽象中很難理解。基本上,我有一個對象具有與數據集中變量名稱相關的方法。我想寫一個函數,允許用戶選擇變量,因此需要的方法。因此我不能將該方法硬編碼到我的函數中;例如使用「Hi」。因爲有時變量可能被稱爲「上」,甚至「foo」,所以下標不夠。 – Alex

回答

5

當你給的名字lower,這意味着查找名稱lower在全局命名空間。它不在那裏,因爲您正在查找字符串的lower方法(str類)。這是拼寫str.lower

然後,在您的功能中,obj.method表示查找objmethod屬性。它與名爲method的參數無關,因此無法以此方式工作。相反,由於您有一個未綁定的方法,因此明確地傳遞該對象作爲self參數:因此,method(obj)。這給了我們:

def passMethod(obj, method): 
    return method(obj) 

passMethod('Hi', str.lower) 

或者,我們可以使用字符串作爲方法的名稱來查找傳入的對象。這看起來像:

def passMethod(obj, method): 
    return getattr(obj, method)() 

passMethod('Hi', 'lower') 
+0

[本文]中的前兩行代碼(http://effbot.org/zone/python-getattr.htm)是等效的:'value = obj。屬性' 'value = getattr(obj,「屬性」)'。我認爲這應該讓你知道沒有'passMethod'函數的第二個例子。 – Darthfett

+0

@Karl Knechtel非常感謝您的解決方案。 – Alex

+0

@Darthfett感謝您的鏈接。 – Alex

1

我不太確定你想要什麼,但它更有意義的傳遞方法的字符串名字:

def passMethod(obj, method_name): 
    return getattr(obj, method_name)() 

passMethod('Hi', 'lower') 
0

好了,第一個問題是你在返回之前調用該方法。而不是返回obj.method()只是返回obj.method。

class Foo: 
    def bar(self): 
     print 'foobar!' 

def pass_bar(obj): 
    return obj.bar 

f = Foo() 
method = pass_bar(f) 
method() # prints 'foobar!' 

另一個問題是你究竟傳遞了什麼來告訴代碼你想要的方法。一個字符串可能?如果是這樣,請嘗試類似

def pass_method(obj, method_name): 
    return getattr(method_name)