Skip to main content
 首页 » 编程设计

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

2025年05月04日8duanxz

有一个覆盖了 __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)] 

当我对结果集执行类似联合的操作时,显然 python 使用第一个集合:

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

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

这个有正式的定义吗?
还是只是未定义解释器对 union 采取的设置?

编辑 说清楚:

两个集合的并集在数学上是对称运算,这里的行为是不对称的。我可以依靠它吗?

请您参考如下方法:

我认为答案在您的类定义中。

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