2014-01-30 2 views
1

동일한 클래스의 더 많은 수의 인스턴스를 처리하는 가장 좋은 방법은 무엇입니까? 현재 메서드를 호출해야하는 경우 목록에 추가 한 다음 목록을 반복합니다.파이썬에서 많은 수의 객체를 처리하는 가장 좋은 방법

[o.method() for o in myObjects] 

위 비록 메타 클래스 대신을 포함하는 목록이있는의

myObjects.method() 

처럼 뭔가 I를 대체 할 수 있다는 점에서 컬렉션으로 그들과 거래를하는 방법이 있나요 목록을 작성하고 이것을 수행하지만, 그것이 다소 복잡해 지는지 궁금합니다. 이를 위해 선호되는 방법이 있습니까?

편집 : 나는 일반적으로 늘 당신이 그것을 쓰기 그러나 반환

+0

이러한 메서드 호출의 * 반환 값 *을 갖고 싶습니까? 또는 rv가 삭제 되었습니까? –

답변

5

의 몇 가지 변화를 할 것이다

파이썬 3에서
from operator import methodcaller 
results = map(methodcaller('method'), myObjects) 

map() 대신에 발전기를 반환하고 그냥리스트 통합 사용하는 것이 가장 효율적 목록 생성하기 :

0 또는 지능형리스트는 균일 한 개체의 순서를 처리하는 올바른 방법입니다

그러나 관심이있는 모든 것이 메서드 호출이고 반환 값을 버리는 경우 (예 : None이기 때문에) 아무 것도없는 목록 개체를 만듭니다. 부작용을 위해 목록 이해력을 사용하고 불필요하게 많은 과정을 통해 None 참조 목록을 생성합니다.

이런 경우, 당신은 단지 간단한 for 루프 사용

때문에 파이썬의 동적 특성의
for o in myObjects: 
    o.method() 

, 일련의 객체 모두 같은 방법이있는 경우 파이썬이 알 수있는 방법으로, 없다를 어떤 경우이든. Zen of Python에는 명시 적 (implicit)보다 묵시적 (explicit)이 좋고 가독성 (readability)이 중요하기 때문에 '콜렉션 호출'구문은 없습니다. 당신은 이것을 명시 적으로 철자 할 것으로 예상됩니다.

0

값이 필요, 모든 객체에 method을 실행할 수있는 유일한 방법은 (당신이 method를 다시 작성하고 목록을 최적화 할 수 있습니다하지 않는 한) 그들을 반복하는 것입니다 . 당신이 myObjects.method라는 일부 클래스 메소드 또는 수집 방법이 있다면 당신은 모든 방법의 반환 값을 갖고 싶어 예는, 내부적으로는 여전히 다음 중 하나 map()를 사용하여 목록에 호출

for o in myObjects: 
    o.method() 
0

할 수도 하위 클래스 list이 경우 처리하기 위해이 당신이 무엇을 얻을

class Test: 
    _instances = customList() 

    def __init__(self, arg=0): 
     self._instances.append(self) 
     self.nb = arg 

    def incr(self, arg): 
     self.nb += arg 

    def get_nb(self): 
     return self.nb 

    @classmethod 
    def get_instances(cls): 
     return cls._instances 

: 그리고 여기

class customList(list): 
    def __getattribute__(self, attr): 
     try: 
      return super(customList, self).__getattribute__(attr) 
     except AttributeError: 
      method_list = [getattr(el, attr) for el in self] 
      def call_me(*args, **kwargs): 
       return [method(*args, **kwargs) for method in method_list] 
      return call_me 

는 테스트 클래스를

>>> a = Test(0) 
>>> b = Test(1) 
>>> c = Test(2) 
>>> instances = Test.get_instances() 
>>> instances.incr(3) 
[None, None, None] 
>>> instances.get_nb() 
[3, 4, 5] 
관련 문제