2011-11-03 4 views
1

내가 찾고있는 용어가있을 것이라고 확신합니다. 그렇지 않다면 내가하려는 것은 매우 훌륭한 이유가 있습니다. 사실 바보.특정 속성에 특정 값이있는 클래스 인스턴스 가져 오기

하지만 어쨌든. 특정 값으로 설정된 속성이있는 특정 클래스 인스턴스를 찾는 기본 메서드가 있는지 궁금합니다.

예 :

class Klass(object): 
    def __init__(self, value): 
     self.value = value 
    def square_value(self): 
     return self.value * self.value 

>>> a = Klass(1) 
>>> b = Klass(2) 
>>> instance = find_instance([a, b], value=1) 
>>> instance.square_value() 
1 
>>> instance = find_instance([a, b], value=2) 
>>> instance.square_value() 
4 

내가 모든 클라스 인스턴스를 통해 루프, 요청 된 값으로 사람을 반환하는 함수를 작성할 수 있다는 것을 알고있다. 다른 한편,이 기능은 Python 내에 이미 존재해야하는 것처럼 느껴지며, 그렇지 않은 경우, 그렇지 않은 이유가 있어야합니다. 다른 말로하면, 내가 여기서하려고하는 것이 훨씬 더 나은 방법으로 행해질 수 있다는 것입니다.

(물론 저는 값을 제곱 할 방법을 찾고 있지 않습니다. 위의 내용은 내가 찾고자하는 구성의 한 예입니다.)

+0

이것은 매우 모호합니다. 당신이 달성하고자하는 것을 설명해 주시겠습니까? 어쩌면 코드를 추가할까요? – Thomas

+0

그게 뭔지 ... – rossipedia

+0

죄송합니다 - 나는 태그 필드에 을 밀고 너무 일찍 질문을 제출했습니다. – LaundroMat

답변

4

사용 필터 :

filter(lambda obj: obj.value == 1, [a, b]) 

필터는 사용자가 지정하는 요구 사항을 충족 개체의 목록을 반환합니다. 문서 : http://docs.python.org/library/functions.html#filter

바스 티아, filter(fn, list)list을 반복하며 각 항목에 fn을 적용합니다. fn이 true를 반환하는 모든 항목을 수집하고 목록에 넣은 다음 반환합니다.

NB : 일치하는 개체가 하나만있는 경우에도 필터는 항상 목록을 반환합니다. 만 일치하는 인스턴스를 반환하고 싶어한다면, 당신은 뭔가를해야 할 것 : 그런 다음, 또는 더 나은 아직

def find_instance(fn, objs): 
    all_matches = filter(fn, objs) 
    if len(all_matches) == 0: 
     return False # no matches 
    else: 
     return all_matches[0] 

def find_instance(fn, objs): 
    all_matches = filter(fn, objs) 
    return len(all_matches) > 0 and all_matches[0] # uses the fact that 'and' returns its second argument if its first argument evaluates to True. 

을,이 함수를 호출 할 것 같은 :

instance = find_instance(lambda x: x.value == 1, [a, b]) 

다음 instancea이 될 것입니다. 당신은 단지 하나 개의 일치 인스턴스를 찾고 있다면

2

오드의 대답의보다 효율적인 버전,

def find_instance(fn, objs): 
    all_matches = (o for o in objs if fn(objs)) 
    return next(all_matches, None) 

instance = find_instance(lambda x: x.value == 1, [a, b]) 

테스트 기능을 경우 좋은 첫 경기를 (발견하면이 즉시 검색을 중지 할 것 비싸거나 목록이 큽니다.) 또는 일치하는 항목이없는 경우 None.

next 함수는 Python 2의 새로운 기능입니다.6;

instance = next((o for o in [a, b] if o.value == 1), None) 

는 후자가있다 : 이전 버전에서, 나는 당신이 단 한 번이 일을하는 경우, 당신은 한 - 라이너로 할 수있는, 물론

try: 
    return all_matches.next() 
except StopIteration: 
    return None 

할 생각 그 차이가 사소한 것 일지 모르지만, 많은 함수 호출을하지 않는 이점은 약간 더 빠를 수도 있습니다.

+2

Dougal의 코드는 생성자 표현식의 예입니다 ([] 대신 o를 포함하는 비트를 포함하는 것에주의하십시오.) 이것은 일치 목록을 사전 빌드하지 않고 지시문 만 작성합니다 'next (matches, None)'라고 말하면, 파이썬은 명령을 실행하기 시작하지만 첫 번째 매치를 생성 할 때 멈춘다 (next()를 반복적으로 호출함으로써 더 많은 매치를 얻을 수있다) 'None' 비트는 기본적으로 일치하는 것이 없으면 생성자에게 None을 반환하도록 지시합니다. 생성자 표현식 용 문서 : http://docs.python.org/tutorial/classes.html#generator-expressions – Ord