我想将属性添加到集合中的实例。
类Problem
的对象集由属性uid
标识(这就是它们被散列和比较的原因):
class Problem:
allowed_keys = [
'flag1',
'a_list_of_objects'
]
def __init__(self, uid, name, **kwargs):
self.uid = uid
self.name = name
self.__dict__.update((k, v) for k, v in kwargs.iteritems() if k in self.allowed_keys)
def __eq__(self, other):
return isinstance(other, self.__class__) and getattr(other, 'uid', None) == self.uid
def __hash__(self):
return hash(self.uid)
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return json.dumps(self.__dict__, sort_keys=True)
此问题的所有实例都会添加到一个集合中。
problem_set = set()
problem1 = Problem(uid="abc123", name="name1", flag1=True)
problem_set.add(problem1)
problem2 = Problem(uid="xyz789", name="name2", flag2=False)
problem_set.add(problem2)
现在,如果我想用另一个属性更新对象problem1
(以前它永远不会存在),它就不会将a_list_of_objects
添加到现有的problem1
< / p>
my_list = [{"a": "avalue", "b": "bvalue"}]
problem3 = Problem(uid="abc123", name="name1", a_list_of_objects=my_list
print list(problem_set)
# same list as before
为了达到这个目的,我需要做什么?使用@property
并为类Problem
的每个属性创建getter和setter?
答案 0 :(得分:2)
您没有修改现有的problem1
实例。您正在创建一个完全不同的实例problem3
,尽管等于problem1
执行__eq__
。满足平等的实例不会以我认为您期望的方式合并或同步。具有相同uid
并因此哈希值的类的实例可以作为独立对象在 set 之外自由存在。尝试将其中一个添加到集将删除一个,而不是同步。
要修改problem1
,您应该这样做:
problem1.a_list_of_objects = my_list
或者您可以分配给my_list
的副本,以避免在实例之间共享相同的列表:
import copy
problem1.a_list_of_objects = copy.deepcopy(my_list)
新属性可以绑定到您班级的现有实例。