在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感谢您的链接。