如何创建满足特定条件的动态更新的类实例列表?(蟒蛇)



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

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

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

谢谢。

列表理解:

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

如果您需要将其分配给变量,并且希望该变量在每次访问时自动更新,则可以将相同的代码放在 lambda、普通函数中,或者,如果您的变量是类成员,则放在属性 getter 中。

除非非常仔细地控制,否则"远距离作用"/突变/副作用的形式很差。

也就是说,命令式语言会让你这样做,如果你真的愿意,如下所示。这里我们使用python的[属性getters and 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。如果Person实例是不可变的,请使用__new__,或者MAR_STATUS属性并在 setter 方法中调用已注册的回调(有关更复杂的实现,请参阅 traits 库中的通知(。

最新更新