2012-05-22 3 views
2

인스턴스 속성의 특정 조건에 따라 자동으로 업데이트되는 클래스 인스턴스 목록을 만들고 싶습니다.특정 조건을 만족하면서 클래스 인스턴스의 목록을 동적으로 업데이트하는 방법은 무엇입니까? (Python)

예를 들어, 사용자 정의 클래스 Person()의 객체 목록이 있고 항상 모든 결혼 된 사람을 포함하는 목록을 생성 할 수 있습니다. 즉 'MAR_STATUS'속성이 ' 기혼'.

파이썬에서는이 모든 것이 가능합니까? C++ 프리 컴파일러를 사용하여 microsimulation에 "actor_set"이라는 매우 편리한 내장 함수를 사용했습니다. 하지만 C++에서 어떻게 구현되는지 전혀 모르겠습니다.

감사합니다.

답변

4

목록 이해 :

[person for person in people if person.MAR_STATUS == 'MARRIED'] 

당신이 변수에 할당 할 필요가 자동으로 모든 액세스를 업데이트 할 변수, 당신은, 람다의 정상적인 기능을이 같은 코드를 삽입 할 수 원하는 경우, 또는 변수가 클래스 멤버 인 경우 속성 가져 오기 도구에서

2

아주 조심스럽게 통제하지 않는 한 "거리에서의 행동"/ 돌연변이/부작용이있는 것이 형편이 아닙니다.

즉, 다음과 같이 명령형 언어를 사용하면 실제로 그렇게 할 수 있습니다.() getMarriedPeople에 액세스 상각 O (1) 시간이 아닌 O (1) 시간을 실행

MARRIED_SET = set() 
def updateMarriedSet(changedPerson): 
    if hasattr(changedPerson,'married') and changedPerson.married==Person.MARRIED: 
     MARRIED_SET.add(changedPerson) 
    else: 
     MARRIED_SET.discard(changedPerson) 

class Person(object): 
    ... 

    @property 
    def married(self): 
     """The person is married""" 
     return self._married 

    @married.setter 
    def married(self, newStatus): 
     self._married = newStatus 
     updateMarriedSet(self) 

    @married.deleter 
    def married(self): 
     del self._married 
     updateMarriedSet(self) 

난이, 아마도 보장하기 위해 유용 할 수 있습니다 상상할 수 : 여기에서 우리는 파이썬의 [property getters and setters]를 사용합니다.

+0

사전을 표시하는 대신 변경 사항이있을 때 사람들을 삽입하고 제거 할 수있는 세트를 사용할 수 있으며 같은 노력으로 O (1) 명의 결혼 한 사람이 있습니다. –

+0

@AlejandroPiad : 당신이 무엇을 제안하는지 잘 모르겠습니다. 그것은 이미 O (1)이었다. OP가 목록을 원한다는 사실을 언급하지 않는 한 (집합/명사가 아니라 둘 다 목록보다 합리적입니다.) 어쨌든 조금 수정했습니다. – ninjagecko

+0

내가 언급 한 것은 dict을 업데이트하는 것이 매번 O (1)이지만, dict은 매번 결혼 한 것이 아니라 모든 사람을 포함한다는 것입니다. 기혼자들에게만 반복하기를 바란다. 나는 그가 원하는 것을 바라고 있으며, 모든 사람들을 반복해야한다. 새 편집 내용은 내가 염두에 두었던 것입니다. 미안 처음 코멘트에서 자신을 설명하지 않았다면. –

0

간단한 방법은 예를 들어 @ sr2222의 대답과 같이 즉석에서 목록을 생성하는 것입니다.

대안으로 MAR_STATUS이 변경 될 때마다 임의의 콜백을 호출 할 수 있습니다. Person 인스턴스가 불변 인 경우 __new__을 사용하거나 MAR_STATUSproperty으로 설정하고 setter 메서드에서 등록 된 콜백을 호출하십시오.보다 복잡한 구현은 traits 라이브러리의 알림을 참조하십시오.