2012-04-19 6 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

을 __init__입니다 암시 적으로 호출되지 않았습니다. – loki

답변

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

람다 함수는 목록의 각 객체를 가져 와서 해당 객체에서 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 순수한지도 구현이 있습니다.

3

가장 실용적인 목적을 위해, 내가 ALG의 지능형리스트 @ 권하고 싶습니다,하지만 당신은뿐만 아니라 map하여이 작업을 수행 할 수 있습니다 : 당신은 A의 __init__ 폼 B와 C에 대한 호출을 놓치고

>>> import operator 
>>> map(operator.methodcaller("foo"), [B(1), C(1)]) 
[2, 0] 
관련 문제