2012-04-19 67 views
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)]) 

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

我希望我明确自己。

NB:我主要使用Python2.7,但我同样会对“新版本”有效的解决方案感兴趣。

+0

你错过调用A的__init__形式B和C,__init__是不隐含地称呼。 – loki 2012-04-19 15:41:08

回答

3
>>> map(lambda x: x.foo(), [B(1), C(1)]) 
>>> [2, 0] 

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

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有着纯正的Map实现,如果你要选择一个。

3

从最实用的目的,我建议@ ALG的名单理解,但你可以用map也这么做:

>>> import operator 
>>> map(operator.methodcaller("foo"), [B(1), C(1)]) 
[2, 0] 
相关问题