class A:
def __init__(self, x, y):
self.x = x
self.y = y
def __hash__(self):
return hash((self.x, self.y))
a1 = A(1, 2)
a2 = A(2, 3)
a3 = A(1, 2)
my_tuple = (a1, a2, a3)
print(hash(a1), hash(a3))
print(my_tuple)
"""结果:
-3550055125485641917 -3550055125485641917
(<__main__.A object at 0x0000023285B21CA0>, <__main__.A object at 0x0000023285B08760>, <__main__.A object at 0x0000023285B081F0>)
"""
# 需要求哈希值时调用hash函数,hash函数先调用__hash__方法,如果返回的值相同再调用__eq__方法。由于本类未重载基类的__eq__方法,于是调用object类的__eq__方法。而基类__eq__方法比较
# 是很严格的,它要求对象标识相同,而对象一旦被创建它的标识就是不变的。即使对象值相同,他们也有不同的标识,于是还是都被放入了集合中,这显然是不合理的。比起标识我们更关注的是对象的值
# 所以考虑重载__eq__方法,只要两个对象值相等那么他们就是相等的