2

インスタンス属性の特定の条件に従って自動的に更新されるクラスインスタンスのリストを作成したいと思います。

たとえば、カスタムクラスPerson()のオブジェクトのリストがあり、常にすべての既婚者、つまり「MARRIED」に等しい属性「MAR_STATUS」を持つすべての人を含むリストを生成できるようにしたいと考えています。

これはPythonでまったく可能ですか?私は、まさにこれを行う「actor_set」と呼ばれる非常に便利な組み込みを備えたマイクロシミュレーション用のC++プリコンパイラーを使用しました。しかし、C++でどのように実装されたかはわかりません。

ありがとうございました。

4

3 に答える 3

4

リスト内包表記:

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

変数に割り当てる必要があり、その変数がアクセスごとに自動的に更新されるようにする場合は、この同じコードをラムダ、通常の関数、または変数がクラス メンバーの場合はプロパティ ゲッターに配置できます。

于 2012-05-22T15:45:08.827 に答える
2

非常に慎重に制御しない限り、「離れた場所でのアクション」/突然変異/副作用を持つのは貧弱な形です.

とはいえ、命令型言語を使用すると、本当にやりたい場合は次のようにできます。ここでは、python の [プロパティの getter と setter ]を使用します。

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)

これはおそらく、getMarriedPeople() へのアクセスが償却された O(1) 時間ではなく O(1) 時間で実行されるようにするのに役立つかもしれないと想像できます。

于 2012-05-22T15:58:53.670 に答える
0

簡単な方法は、@ sr2222の回答に示されているように、その場でリストを生成することです。

別の方法として、変更のたびに任意のコールバックを呼び出すことができますMAR_STATUS。インスタンスが不変である__new__場合に使用するか、プロパティを作成し、setter メソッドで登録されたコールバックを呼び出します (より複雑な実装については、特性ライブラリの通知を参照してください)。PersonMAR_STATUS

于 2012-05-22T16:09:00.847 に答える