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

时间:2012-05-22 15:39:21

标签: python oop list agent-based-modeling

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

例如,我有一个自定义类Person()的对象列表,我希望能够生成一个总是包含所有已婚人员的列表,即所有具有'MAR_STATUS'属性等于'MARRIED'的人”。

这在Python中是否可行?我使用了一个C ++预编译器进行微程序设计,它有一个非常方便的内置程序叫做“actor_set”,它就是这样做的。但我不知道它是如何在C ++中实现的。

谢谢。

3 个答案:

答案 0 :(得分:4)

列表理解:

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

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

答案 1 :(得分:2)

除非经过非常谨慎的控制,否则“远距离行动”/突变/副作用是不好的形式。

那就是说,如果你真的想要,命令式语言会让你这样做,如下所示。这里我们使用python的[property 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)时间有用。

答案 2 :(得分:0)

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

作为替代方案,每次MAR_STATUS更改时都可以调用任意回调。如果__new__实例是不可变的,请使用Person或使property成为traits并在setter方法中调用已注册的回调(请参阅{{3}}库中的通知以获取更复杂的内容实现)。