2012-04-19 68 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] 
相關問題