将方法映射到不同对象的列表上

时间:2012-04-19 15:24:52

标签: python inheritance mapping

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

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

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,但我同样对那些对“较新”版本有效的解决方案感兴趣。

3 个答案:

答案 0 :(得分: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有一个纯粹的地图实现。

答案 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]