2012-05-14 32 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)