Python:在一组对象

时间:2016-10-27 09:57:38

标签: python python-2.7

我想将属性添加到集合中的实例。 类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?

1 个答案:

答案 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)

新属性可以绑定到您班级的现有实例。