这段代码:
class Water:def __init__(self, name: str) -> None:self.name = namedef __str__(self) -> str:self.namedef __repr__(self) -> str:return f'{self.__class__.__name__}({self.name})'a_set = set()
a_set.add(Water('百岁山'))
a_set.add(Water('农夫'))
a_set.add(Water('农夫'))
a_set.add(Water('怡宝'))
a_set.add(Water('怡宝'))
print(len(a_set))
的输出结果是5 (‘百岁山‘、’农夫‘ * 2 、’怡宝‘ * 2)
如果希望集合在add的时候,就对相同name的Water对象去重,可通过给Water类添加__hash__和__eq__魔法方法实现。
魔改后代码如下:
class Water:def __init__(self, name: str) -> None:self.name = namedef __str__(self) -> str:return self.namedef __repr__(self) -> str:return f"{self.__class__.__name__}({self.name})"def __hash__(self) -> int:return hash(self.name)def __eq__(self, other) -> bool:return type(self) is type(other) and hash(self) == hash(other)a_set = set()
a_set.add(Water("百岁山"))
a_set.add(Water("农夫"))
a_set.add(Water("农夫"))
a_set.add(Water("怡宝"))
a_set.add(Water("怡宝"))
print(len(a_set))
这时候,执行结果是3