Python:带方法的高阶函数

Python: Higher Order Functions with Methods

在 Python 中,是否可以像传递常规函数那样将方法传递给高阶函数?

例如,假设我有一个字符串 "str",并且根据某些条件 "cond",我想对字符串应用某种任意方法 "meth"和 return 它。在代码中:

def func(str, meth, cond):
    ...
    if cond:
        str.meth()
    ...

现在,我知道上面的方法行不通了。我也知道我可以写这样的东西:

def func(str, meth, cond):
    ...
    if cond:
        str = meth
    ...

并将我要执行的对象和方法传递给 func,如下所示:func(str, str.capitalize(), cond)。上面的问题是:

  1. 上面的代码没有把函数的意图说清楚。
  2. 例如,如果我想在应用该方法之前无论如何修改 "str",那么我最终会得到不正确的结果。考虑:

    def func(str, meth, cond):
        ...
        str += "a"
        ...
        if cond:
            str = meth
        ...
    

    将无法正常工作。

那么,return回到开头:有没有办法实现我想要的?还是我完全从错误的方向接近这个?

这不允许您完全按照您的意愿调用函数,但它非常接近,所以也许它可以解决您的问题。

def func(str, meth, cond):
    if cond:
        str = getattr(str, meth)()
    return str

print func("a", "capitalize", True)
print func("a", "capitalize", False)

您可以像传递任何函数一样将方法传递给高阶函数,只需将其传递为 object.method:

class Foo(object):
    def upper(self, s):
        return s.upper()

def func(s, method, cond):
    if cond:
        return method(s)
    else:
        return s

obj = Foo()
s = 'hello world'

print(func(s, obj.upper, 'hello' in s))   
print(func(s, obj.upper, 'goodbye' in s))

结果:

HELLO WORLD
hello world

或者如果您可以尝试:

def func(s, method, cond):
    if cond:
        return method()
    else:
        return s

s = 'hello world'

print(func(s, s.upper, 'hello' in s))
print(func(s, s.upper, 'goodbye' in s))

但是,正如评论中所指出的,如果您在函数内部有一个 s = s + 'a' 语句,则第二种方法将不起作用,因为您只是将局部变量 s 绑定到一个新字符串,而 method 仍然绑定到最初传递给函数的字符串的 upper 方法。

我认为你将 meth 作为无界方法传递是什么,因此它可以动态地绑定到另一个对象。

>>> class C(object):
...     def foo(self):
...             print self
... 
>>> C.foo
<unbound method C.foo>
>>> C().foo
<bound method C.foo of <__main__.C object at 0xb708216c>>
>>> def func(obj, meth):
...     meth(obj)
... 
>>> c = C()
>>> func(c, C.foo)
<__main__.C object at 0xb70822ac>
>>> c
<__main__.C object at 0xb70822ac>

您可以将无界方法视为必须将对象作为其第一个参数的常规方法

不太确定你在问什么,但你可以传递如下函数。

def func(str, meth, cond):
    ...
    ...
    if cond:
        return meth(str)
    ...

和运行它是这样的:(例如小写)

func("ABC", str.lower, True)

应该return"abc"