我试图调用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
from operator import methodcaller
map(methodcaller('methodname'), object_list)
Run Code Online (Sandbox Code Playgroud)
这适用于所有具有相同方法的对象列表(按名称); 如果列表中有不同的类型则无关紧要.
Cha*_*rsh 11
newList = map(method, objectList)会打电话method(object)给每个object人objectlist.
使用map执行此操作的方法需要lambda函数,例如:
map(lambda obj: obj.method(), objectlist)
Run Code Online (Sandbox Code Playgroud)
列表理解可能会略微加快,因为你不需要一个lambda,它有一些开销(在这里讨论一下).
如果列表的内容都是同一个类的实例,你可以用类名作为方法名的前缀。
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)
| 归档时间: |
|
| 查看次数: |
8198 次 |
| 最近记录: |