我想创建一个类实例列表,该列表根据实例属性的特定条件自动更新自身。
例如,我有一个自定义类 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 库中的通知(。