2

我在函数中传递方法时遇到问题。我已经看过这个以前的帖子。

如何在 Python 中将方法作为参数传递

这是我尝试过的一个简单示例。

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

passMethod('Hi', lower)

最后,我将使用它来帮助编写一个处理 GIS(地理信息系统)数据的函数。数据就像一个数组。我想在数组中添加一个新列 NAME1。然后该数组具有调用列array.NAME1 的方法。

问候,亚历克斯

4

3 回答 3

5

当你给出 name时,这意味着在全局命名空间中lower查找 name 。lower它不存在,因为您正在寻找lower字符串(str类)的方法。那是拼写str.lower

然后,在您的函数中,意味着obj.method查找method. obj它与名为 的参数无关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')
于 2012-05-14T21:40:10.847 回答
1

我不确定您想要什么,但将方法名称作为字符串传递更有意义:

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

passMethod('Hi', 'lower')
于 2012-05-14T21:42:34.090 回答
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)
于 2012-05-14T22:13:13.897 回答