Python给自定义类添加__eq__和__hash__使其添加到set后能去重

这段代码:

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值