我想创建一个类实例列表,它可以根据实例属性的特定条件自动更新自身。

例如,我有一个自定义类 Person() 的对象列表,我希望能够生成一个始终包含所有已婚人士的列表,即所有属性“MAR_STATUS”等于“已婚”的人。

这在 Python 中可能吗?我使用了一个 C++ 预编译器进行微观模拟,它有一个非常方便的内置函数,名为“actor_set”,它正是这样做的。但我不知道它是如何在C++中实现的。

谢谢。

有帮助吗?

解决方案

列表理解:

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

如果您需要将其分配给变量,并且希望变量会自动更新每一个访问,则可以将相同的代码放在lambda,正常函数,或者如果您的变量是一个类成员Property Getter。

其他提示

它是较差的形式,以“在距离处的动作”/突变/副作用,除非它非常精心控制。

表示,如果您真的想要,则令人遗憾的语言将让您执行此操作,如下所示。在这里,我们使用python的[属性getters和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)
.

我可以想象这个可能,可能是有用的,可以确保访问getMarriedpeople()在O(1)时间而不是摊销O(1)时间。

简单的方法是动态生成列表,例如,如 @sr2222 的答案所示。

作为替代方案,您可以每次调用任意回调 MAR_STATUS 变化。使用 __new__ 如果 Person 实例是不可变的或使 MAR_STATUS A 财产 并在 setter 方法中调用注册的回调(请参阅中的通知 特质 库以实现更复杂的实现)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top