特定の状態を満たすクラスインスタンスの動的に更新されたリストを作成する方法(Python)

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

質問

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

例えば、私のカスタムクラスの人()のオブジェクトのリストを持っています、そして私は常にすべての既婚者を含むリストを生成することができます、すなわち属性 'mar_status'が結婚しているすべての人'。

これはPython全体で可能ですか?私は、これを正確にした「actor_set」という非常に便利な組み込みの "actor_set"を持つ微妙な中でC ++プリコンパイラを使用しました。しかし、私はそれがC ++でどのように実装されたかについてはわかりません。

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

役に立ちましたか?

解決

リスト理解:

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

変数に割り当てる必要があり、その変数がすべてのアクセスを自動的に更新する必要がある場合は、この同じコードをLambda、通常の関数、または変数がクラスメンバーである場合は、プロパティゲーター

他のヒント

非常に慎重に管理されていない限り、「距離での行動」/突然変異/副作用を持つことは劣っています。

言った、あなたが本当に望むなら、あなたが本当に望むなら、あなたに次のようにすることを可能にするでしょう。ここでは、pythonの[プロパティゲッターとセッター]を使用しています:

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)時間で実行されます。

簡単な方法は、@ SR2222の答えのように、その場でリストを生成することです。

は、MAR_STATUSが変更されるたびに任意のコールバックを呼び出すことができます。__new__を使用するPersonインスタンスが不変である場合、またはMAR_STATUS A の通知を参照)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top