我想在实例化不同类的对象列表上映射方法。所有对象都从相同的基类继承,并定义所需名称的方法。
为了更清楚,请考虑以下代码:
class A:
def __init__(self, x):
self.x = x
def foo (self):
return self.x
class B(A):
def foo (self):
return self.x+1
class C(A):
def foo (self):
return self.x-1
现在考虑实例化B类和C类的对象列表。我想做类似的事情:
result = []
for obj in [B(1), C(1)]:
result.append(obj.foo())
您将如何继续在列表的每个元素上映射方法foo?它可能吗?我能想出的最好的是:
map(A.foo, [B(1), C(1)])
但显然它不会返回我想要的结果。如何指定与对象相关的方法?
我希望我能说清楚。
NB :我主要使用Python2.7,但我同样对那些对“较新”版本有效的解决方案感兴趣。
答案 0 :(得分:4)
Map(A.foo, [B(1), C(1)])
基本上是A.foo(B(1))
和A.foo(C(1))
,而不是您正在寻找的。 p>
使用上面的课程,我会这样做:
In: objs = [B(1), C(1)]
In: [x.foo() for x in objs]
Out: [2, 0]
如果您愿意,Amjith有一个纯粹的地图实现。
答案 1 :(得分:3)
>>> map(lambda x: x.foo(), [B(1), C(1)])
>>> [2, 0]
lambda函数将获取列表中的每个对象,并在该对象上调用foo()。因此,结果列表将具有相应对象的foo()返回的结果。
答案 2 :(得分:3)
对于大多数实际用途,我建议使用@ AlG的列表理解,但你也可以使用map
执行此操作:
>>> import operator
>>> map(operator.methodcaller("foo"), [B(1), C(1)])
[2, 0]