Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中传递方法_Python - Fatal编程技术网

在python中传递方法

在python中传递方法,python,Python,我在函数中传递方法时遇到问题。我已经看过之前的这篇文章了 下面是一个我尝试过的简单例子 def passMethod(obj, method): return obj.method() passMethod('Hi', lower) 最后,我将用它来帮助编写一个处理GIS(地理信息系统)数据的函数。数据就像一个数组。我想向数组中添加一个新列名1。然后,该数组有一个方法来调用列array.NAME1 问候,, Alex当您指定名称lower时,这意味着在全局命名空间中查找名称lowe

我在函数中传递方法时遇到问题。我已经看过之前的这篇文章了

下面是一个我尝试过的简单例子

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

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

问候,,
Alex

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

然后,在函数中,
obj.method
表示查找
obj
method
属性。它与名为
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')

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

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

passMethod('Hi', 'lower')

第一个问题是,在返回方法之前调用该方法。只需返回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)

你熟悉地图吗?也许有一点
\uuuu iter\uuuu
?我不确定您为什么希望以这种方式传递一个方法(虽然有合法的用例,但是您希望这样做的一些上下文会很好)。如果您不熟悉python,您可能没有意识到您可以传递
'Hi'。这将为您提供一个可调用对象,该对象返回
'hi'
@Darthfett,我在上一段中试图提供一些上下文;但抽象地说,这很难理解。基本上,我有一个对象,其中包含与数据集中变量名相关的方法。我想写一个函数,允许用户选择变量,从而选择所需的方法。因此,我无法将该方法硬编码到我的函数中;e、 例如,使用“Hi”。lower是不够的,因为有时变量可能被称为upper,甚至foo。@AlexOlssen我仍然有点不确定您到底需要什么。如果使用
getattr
无法完成所有需要的操作,则操作员模块提供的功能可能对您的场景有用。中的前两行代码是等效的:
value=obj.attribute
value=getattr(obj,“attribute”)
。我认为这应该让您了解第二个示例在没有
passMethod
函数的情况下的外观。@Karl Knechtel感谢您的解决方案非常有效。@Darthfett感谢您的链接。