我想创建一个类实例列表,它会根据实例属性的特定条件自动更新自身。
例如,我有一个我的自定义类 Person() 的对象列表,并且我希望能够生成一个始终包含所有已婚人士的列表,即所有属性“MAR_STATUS”等于“MARRIED”的人。
这在 Python 中可能吗?我使用了一个 C++ 预编译器来进行微模拟,它有一个非常方便的内置函数,叫做“actor_set”,它就是这样做的。但我不知道它是如何在 C++ 中实现的。
谢谢你。
我想创建一个类实例列表,它会根据实例属性的特定条件自动更新自身。
例如,我有一个我的自定义类 Person() 的对象列表,并且我希望能够生成一个始终包含所有已婚人士的列表,即所有属性“MAR_STATUS”等于“MARRIED”的人。
这在 Python 中可能吗?我使用了一个 C++ 预编译器来进行微模拟,它有一个非常方便的内置函数,叫做“actor_set”,它就是这样做的。但我不知道它是如何在 C++ 中实现的。
谢谢你。
列表理解:
[person for person in people if person.MAR_STATUS == 'MARRIED']
如果您需要将它分配给一个变量,并且希望该变量在每次访问时自动更新,您可以将相同的代码放入一个 lambda、一个普通函数,或者,如果您的变量是一个类成员,则放入一个属性 getter。
除非非常仔细地控制,否则“远距离行动”/突变/副作用是不好的形式。
也就是说,如果您真的愿意,命令式语言将允许您这样做,如下所示。这里我们使用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) 时间摊销。