这段代码:
class Water:
def __init__(self, name: str) -> None:
self.name = name
def __str__(self) -> str:
self.name
def __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 = name
def __str__(self) -> str:
return self.name
def __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