2

我想在实例化不同类的对象列表上映射一个方法。所有对象都继承自同一个基类并定义所需名称的方法。

为了更清楚,请考虑以下代码:

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)])

但显然它没有返回我想要的结果。如何指定与对象相关的方法?

我希望我说清楚了。

注意:我主要使用 Python2.7,但我同样对适用于“较新”版本的解决方案感兴趣。

4

3 回答 3

4

Map(A.foo, [B(1), C(1)])基本上是在做A.foo(B(1))A.foo(C(1))这不是你要找的。

从上面使用您的课程,我会这样做:

In: objs = [B(1), C(1)]
In: [x.foo() for x in objs]
Out: [2, 0]

如果您愿意,Amjith 有一个纯地图实现。

于 2012-04-19T15:32:26.743 回答
3

对于大多数实际目的,我推荐@AlG 的列表理解,但你也可以这样做map

>>> import operator
>>> map(operator.methodcaller("foo"), [B(1), C(1)])
[2, 0]
于 2012-04-19T15:34:59.270 回答
3
>>> map(lambda x: x.foo(), [B(1), C(1)])
>>> [2, 0]

lambda 函数将获取列表中的每个对象并在该对象上调用 foo()。因此,结果列表将具有相应对象的 foo() 返回的结果。

于 2012-04-19T15:29:12.740 回答