如何使用map()在对象列表上调用类方法

Ste*_*han 9 python python-2.7

我试图调用object.method()一个对象列表.

我试过这个,但无法让它正常工作

newList = map(method, objectList)
Run Code Online (Sandbox Code Playgroud)

我得到错误,method is not defined但我知道这是因为它是一个类方法而不是本地函数.

有没有办法用这个map()或类似的内置功能?或者我必须使用生成器/列表理解?

编辑您是否也可以解释使用此列表理解的优势或对比您的解决方案?

newList = [object.method() for object in objectList]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 15

用途operator.methodcaller():

from operator import methodcaller

map(methodcaller('methodname'), object_list)
Run Code Online (Sandbox Code Playgroud)

这适用于所有具有相同方法的对象列表(按名称); 如果列表中有不同的类型则无关紧要.

  • Jeez,你还记得所有这些有用的内置功能吗? (5认同)

Cha*_*rsh 11

newList = map(method, objectList)会打电话method(object)给每个objectobjectlist.

使用map执行此操作的方法需要lambda函数,例如:

map(lambda obj: obj.method(), objectlist)
Run Code Online (Sandbox Code Playgroud)

列表理解可能会略微加快,因为你不需要一个lambda,它有一些开销(在这里讨论一下).

  • 一点点补充:如果你想能够使用任何旧的`method`和任何旧的`objectList`:`new_lister = lambda方法,objectList:map(lambda obj:obj.method(),objectList)`.现在你可以做`newList = new_lister(foo_method,list_of_foos)`等. (2认同)

Kev*_*vin 5

如果列表的内容都是同一个类的实例,你可以用类名作为方法名的前缀。

class Fred:
    def __init__(self, val):
        self.val = val
    def frob(self):
        return self.val

freds = [Fred(4), Fred(8), Fred(15)]
print map(Fred.frob, freds)
Run Code Online (Sandbox Code Playgroud)

结果:

[4, 8, 15]
Run Code Online (Sandbox Code Playgroud)

如果列表的元素是指定类的子类,也可以这样做。但是,它仍然会调用该方法的指定实现,即使该方法在子类中被覆盖。例子:

class Fred:
    def __init__(self, val):
        self.val = val
    def frob(self):
        return self.val

class Barney(Fred):
    def frob(self):
        return self.val * 2

freds = [Fred(4), Barney(8), Barney(15)]
#You might expect the barneys to return twice their val. ex. [4, 16, 30]
#but the actual output is [4, 8, 15]
print map(Fred.frob, freds)
Run Code Online (Sandbox Code Playgroud)

  • 如果列表中的对象至少不是子类,这将失败。 (3认同)