Python的map函数可以调用对象成员函数吗?

时间:2011-10-13 07:49:47

标签: python

我需要做一些与此功能相同的事情:

for foo in foos:
    bar = foo.get_bar()
    # Do something with bar

我的第一直觉是使用map,但这不起作用:

for bar in map(get_bar, foos):
    # Do something with bar

我正在努力通过map实现目标吗?我需要使用列表理解吗?对此最常用的Pythonic成语是什么?

5 个答案:

答案 0 :(得分:45)

使用lambda

for bar in map(lambda foo: foo.get_bar(), foos):

或者只是在实例的类上使用实例方法引用:

for bar in map(Foo.get_bar, foos):

由于这是从评论中添加的,我想请注意,这需要foos的项目为Foo的实例(即all(isinstance(foo, Foo) for foo in foos)必须为真)并且不仅因为其他选项使用get_bar方法执行类的实例。仅此一点可能就足以在此处不包括它。

methodcaller

import operator
get_bar = operator.methodcaller('get_bar')
for bar in map(get_bar, foos):

或者使用生成器表达式:

for bar in (foo.get_bar() for foo in foos):

答案 1 :(得分:7)

你想要operator.methodcaller()。或者,当然,列表或生成器理解。

答案 2 :(得分:4)

我认为最干净的方法是完全放弃varContentType="application/json; charset=utf-8"; $.ajax({ type: varType, //GET or POST or PUT or DELETE verb url: varUrl, // Location of the service data: varData, //Data sent to server contentType: varContentType, // content type sent to server dataType: varDataType, //Expected data format from server processData: false, crossDomain: true, }); - 循环并使用列表理解:

for

这个答案接近其他一些答案,但不同之处在于列表实际上已经返回而未在后续循环中使用。根据您对bars = [foo.get_bar() for foo in foos] 的处理方式,您可以使用列表推导。

除了bars的开销很大,我认为map lambdas函数与map的特殊性无关。

答案 3 :(得分:2)

此修改后的代码将起作用:

for bar in map(lambda f: f.get_bar(), foos):
# Do something with bar

你在这里提供lambda功能。简单地提供get_bar不起作用,因为它只能通过类(f.get_bar())的实例访问,而不能单独访问。

答案 4 :(得分:1)

您可以使用 lambda

for bar in map(lambda foo: foo.get_bar(), foos):
    # Do something with bar