场景
米洛今年国庆节打算给新家添置一些日用的东西,比如床、四件套等等。为此,他使用了各大电商平台
的app,但因为是新家
,所以有些app还没有录入地址。
于是他干脆进行了一波整理,在他的收货地址
里面,找寻自己是否添加过最新的地址。
我们都知道,收货地址最重要的就是地址
+电话
了,通过这个可以确定一个人。因为有些英雄美女喜欢把姓名写成: 喵星人
,吴彦祖
这样的,所以只要确保地址和电话对得上就行。
那我们就需要比较地址是否有重复的,这样就好好管理自己的收货地址嘛。
代码里的收货地址
我们定义一个Receiver类,里面有name/address/mobile3个字段:
class Receiver(object):def __init__(self, name, addr, mobile):self.name = nameself.addr = addrself.mobile = mobile
if __name__ == "__main__":r = Receiver("小孟", "梅苑小区", 13922222222)r2 = Receiver("小孟货", "梅苑小区", 13922222222)print(r == r2)
这样我们的生活
就映射到了代码
之中。由于我们要比较,所以我们这边new了2个收货地址
。
我们想要的是,当addr和mobile一致的时候,我们确定这2个收货地址相同
。
来看看执行效果:
因为r和r2是2个不同的对象,所以他们是肯定不相等的。
思考: 如果是单例模式的class,r等于r2吗?
了解__eq__方法
我们知道,在Python里面比较数字/字符串是否相等,那2个对象是否相等。其实也是可以比较
的。这一切都要归功于__eq__
这个方法。
可以看到有个向上的箭头,这个代表子类
重写了父类
的方法。我们点击一下:
在我们比较2个对象的时候: r == r2
, 实际上是执行了这样的方法:
r.__eq__(r2)
不信咱们试试:
实现
熟悉了__eq__以后,我们问题就迎刃而解了。我们只需要在__eq__方法里面写上对应的判断方法即可。
class Receiver(object):def __init__(self, name, addr, mobile):self.name = nameself.addr = addrself.mobile = mobiledef __eq__(self, other):return self.addr == other.addr and self.mobile == other.mobile
if __name__ == "__main__":r = Receiver("小孟", "梅苑小区", 13922222222)r2 = Receiver("小孟", "梅苑小区", 13922222222)print(r == r2)
更多用途
如果用在接口平台中,我想有以下几个方面可以用到。
- 比较用户是否改动过case当case未改动的时候,我们并不直接
修改
case,而是提示用户没有任何改动* 配置文件pity提供了系统配置功能,有时候我们可能没有发生任何变动就点击
了保存,这样的话由于文件变动涉及到io相关,所以我们可以事先规避
掉。### 扩展
既然能够比较对象是否相等,那能否比较对象大小呢?那就等大家自己探索了,关键字:
lt, gt, ge, le
另外,还有__str__
, __repr__
, __hash__
等方法,大家感兴趣也可以自己重写着玩玩。本文主要在于引导大家多熟悉内置
方法,并在适当的时候用到。