2010-03-21 3 views
0

제목은 분명하지 않지만 설명하려고 노력할 것입니다.파이썬, 래핑 된 클래스의 평균을 반환하는 래핑 클래스

갖는이 클래스 :

class Wrapped(object): 
    def method_a(self): 
     # do some operations 
     return n 

    def method_b(self): 
     # also do some operations 
     return n 

나는이 하나와 동일한 방식으로 수행하는 클래스를 갖고 싶어 : 분명히이 손에서 실제 문제가되지 않습니다

class Wrapper(object): 
    def __init__(self): 
     self.ws = [Wrapped(1),Wrapped(2),Wrapped(3)] 

    def method_a(self): 
     results=[Wrapped.method_a(w) for w in self.ws] 
     sum_ = sum(results,0.0) 
     average = sum_/len(self.ws) 
     return average 

    def method_b(self): 
     results=[Wrapped.method_b(w) for w in self.ws] 
     sum_ = sum(results,0.0) 
     average = sum_/len(self.ws) 
     return average 

를 (그것을하지 않습니다 단 2 가지 방법),이 코드는 불완전합니다 (문제를 설명하기위한 최소값 만 포함).

그래서 내가 찾고있는 것은이 동작을 얻는 방법입니다. 즉, 래퍼 클래스에서 호출되는 모든 메서드는 해당 래핑 된 클래스 객체에 대해 해당 메서드를 호출하고 결과의 평균을 반환합니다.

할 수 있습니까? 방법?

미리 감사드립니다. 답변에 대한

편집
감사합니다 ... 그들에게 솔루션을보고 난 후에 모두는 분명한 것 같다 :)이 잘 솔루션을 설명하기 때문에 알렉스 마르 텔리의 답변을 선택했습니다. 다른 유용한 답변들도 유용합니다. 그래서 나는 또한 그것들을 투표했습니다. 이것에

답변

3

메소드 (또는 다른 속성)를 가져오고 그 호출을 별도의 조작으로 수행하기 때문에 매우 어렵지 만 다소 까다 롭습니다. 여기에 솔루션입니다 :

class Wrapper(object): 
    def __init__(self): 
     self.ws = [Wrapped(1),Wrapped(2),Wrapped(3)] 

    def __getattr__(self, n): 
     meth = getattr(Wrapped, n) 
     def caller(): 
      results = [meth(w) for w in self.ws] 
      sum_ = sum(results,0.0) 
      average = sum_/len(self.ws) 
      return average 
     return caller 

그것은 단순한 약간합니다 (점점 호출 사이에 self.ws에 변화를지지 않습니다이다는 - 한 수 과정의 순간에 "스냅 샷"self.ws의이 원하는 의미인지, 점점; @functools.wraps을 사용하지 않으므로 보존해야하는 경우 docstring &c를 보존하지는 않지만 주로 용도에 맞게 사용해야합니다.

1

당신이 할 수있는 getattr와 (객체에 '인해 임의'메서드를 호출) :

예로서 이것을 고려 :

# this fetches you references to the 'method_a' methods for objects in self.ws 
funcs = [getattr(wrapped_obj, "method_a") for wrapped_obj in self.ws] 
# now execute them to get the results 
results = [func() for func in funcs] 

코드의 나머지 부분은 동일하게 유지됩니다.

1

Wrapper__getattr__ 메서드를 구현하면 모든 래핑 된 객체에 호출을 전달하는 함수를 반환 할 수 있습니다.

import functools 

class Wrapper(object): 
    def __init__(self, *args): 
     self._targets = args 

    def _broadcast(self, name, *args, **kwargs): 
     return [getattr(t, name)(*args, **kwargs) for t in self._targets] 

    def __getattr__(self, name): 
     return functools.partial(self._broadcast, name) 

속성이 발견되지 않는 경우 __getattr__ 만, 당신이 Wrapper에 정의하여 모든 메소드 이름을 호출 할 것을 참고 전달되지 않습니다 (예 : 여기에 기본 구현의 예를 단순히 반환 결과입니다 위의 예에서 _broadcast).

관련 문제