2

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

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

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

谢谢你。

4

3 回答 3

4

列表理解:

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

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

于 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更改时调用任意回调。如果实例是不可变的,或者在 setter 方法中创建属性调用已注册的回调,则使用(请参阅特征库中的通知以__new__了解复杂的实现)。PersonMAR_STATUS

于 2012-05-22T16:09:00.847 回答