특정 조건을 충족하면서 동적으로 업데이트되는 클래스 인스턴스 목록을 만드는 방법은 무엇입니까?(파이썬)

StackOverflow https://stackoverflow.com//questions/10705349

문제

인스턴스 속성의 특정 조건에 따라 자동으로 업데이트되는 클래스 인스턴스 목록을 만들고 싶습니다.

예를 들어, 사용자 정의 클래스인 Person()의 개체 목록이 있고 항상 모든 결혼한 사람을 포함하는 목록을 생성할 수 있기를 원합니다.'MAR_STATUS' 속성이 'MARRIED'와 동일한 모든 사람.

파이썬에서는 이것이 가능합니까?저는 이 작업을 정확하게 수행하는 "actor_set"이라는 매우 편리한 내장 기능이 있는 마이크로 시뮬레이션용 C++ 사전 컴파일러를 사용했습니다.하지만 C++에서 어떻게 구현되었는지는 전혀 모르겠습니다.

감사합니다.

도움이 되었습니까?

해결책

목록 이해 :

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

변수에 할당하고 해당 변수가 모든 액세스에 대해 자동으로 업데이트 할 필요가있는 경우, 람다, 정상적인 기능, 변수가 클래스 멤버 인 경우이 동일한 코드를속성 getter.

다른 팁

거리가 매우 신중하게 제어되지 않는 한 "거리"/ 돌연변이 / 부작용을 갖는 것이 좋지 않습니다.

, 당신이 정말로 원한다면, 당신이 이것을 할 수 있다고 말하면서, 명령 할 수 있습니다.여기서 Python의 [ 속성 getter 및 setters ]를 사용합니다.

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)
.

I 상상할 수 있습니다. 아마도 GetMarriedPeople ()에 대한 액세스가 aroredized o (1) 시간이 아닌 O (1) 시간에 실행되는 것이 유용 할 수 있습니다.

간단한 방법은 @sr2222의 답변에 표시된 것처럼 즉시 목록을 생성하는 것입니다.

대안으로 매번 임의의 콜백을 호출할 수 있습니다. MAR_STATUS 변화.사용 __new__ 만약에 Person 인스턴스는 불변이거나 MAR_STATUS재산 setter 메소드에서 등록된 콜백을 호출합니다(알림 참조). 특성 더 복잡한 구현을 위한 라이브러리).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top