python在自定义类上设置操作 - 联合定义/查找

时间:2017-01-27 15:19:37

标签: python

有一个具有重写__eq____hash__方法的类我使用集合来轻松查找(还有其他原因)。

class Foo:

    def __init__(self, name, value):
        self.name = name
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

    def __hash__(self):
        return self.value

    def __repr__(self):
        return "{} {}".format(self.name, self.value)

mylist = [Foo(None, 1), Foo(None, 2), Foo(None,3)]
reference = [Foo("a", 1), Foo("b", 2), Foo("c", 3)]

当我为结果集执行诸如union之类的操作时,显然python使用第一个集合:

print(set(mylist) | set(reference)) # {None 1, None 2, None 3}
print(set(reference) | set(mylist)) # {a 1, b 2, c 3}

我找不到有关此行为的任何文档。

这是否有正式定义?
或者只是未定义解释器设置union s?

编辑为了说清楚:

两个集合上的并集在数学上是对称运算,此处的行为不对称。我能依靠吗?

2 个答案:

答案 0 :(得分:-1)

我认为答案在你的班级定义中。

__eq__检查值是否相等,而__hash__返回值。因此,当集合统一时,一个集合的元素等于另一个集合的元素(各个值相等),这使得统一集合返回第一个指定集合。

答案 1 :(得分:-1)

eq 方法的实施仅基于'值'属性

将其更改为以下实现应该可以解决问题:

def __eq__(self, other):
    return (self.value == other.value) and (self.name == other.name)