【问题标题】:Passing a method in python [closed]在python中传递一个方法[关闭]
【发布时间】:2012-05-22 09:58:06
【问题描述】:

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

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的方法。

问候, 亚历克斯

【问题讨论】:

  • 你熟悉map吗?也许还有一点__iter__
  • 我不知道你为什么要以这种方式传递一个方法(尽管有合法的用例,你为什么想要这样的一些上下文会很好)。如果你不熟悉 python,你可能没有意识到你可以绕过'Hi'.lower。这将为您提供一个返回 'hi' 的可调用对象。
  • @Darthfett 我试图在最后一段中提供一些上下文;但在抽象中很难理解。基本上,我有一个对象,它具有与数据集中变量名称相关的方法。我想编写一个函数,允许用户选择变量,从而选择所需的方法。因此,我无法将该方法硬编码到我的函数中;例如,使用 'Hi'.lower 是不够的,因为有时变量可能被称为 upper,甚至是 foo。
  • @AlexOlssen 我仍然有点不确定您到底需要什么。如果使用 getattr 无法满足您的所有需求,则操作员模块提供的 attrgetter 函数可能对您的场景很有用。

标签: python


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    def passMethod(obj, method_name):
        return getattr(obj, method_name)()
    
    passMethod('Hi', 'lower')
    

    【讨论】:

      【解决方案3】:

      当您指定名称 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')
      

      【讨论】:

      • this article 中的前两行代码是等价的:value = obj.attributevalue = getattr(obj, "attribute")。我认为这应该让您了解没有 passMethod 函数的第二个示例是什么样子。
      • @Karl Knechtel 感谢您的解决方案完美运行。
      • @Darthfett 感谢您的链接。
      猜你喜欢
      • 2020-11-05
      • 2019-01-07
      • 2012-09-09
      • 2019-03-02
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多