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)。上面的问题是:
- 上面的代码没有把函数的意图说清楚。
例如,如果我想在应用该方法之前无论如何修改 "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"
在 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)。上面的问题是:
- 上面的代码没有把函数的意图说清楚。
例如,如果我想在应用该方法之前无论如何修改 "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"