Python小知识之对象的比较
好久不见
国庆回了趟老家,躺平了10天。作息时间基本和小学生差不多,8、9点就睡了, 那滋味别提多舒服了。时间也和小时候过得一样慢了...长时间不更新,还是不行滴,粉都快掉没了。
今天就结合日常生活的例子,给大家讲讲Python对象之间的比较。(内容不多,小娃儿都能看懂)
场景
米洛今年国庆节打算给新家添置一些日用的东西,比如床、四件套等等。为此,他使用了各大电商平台的app,但因为是新家,所以有些app还没有录入地址。
于是他干脆进行了一波整理,在他的收货地址里面,找寻自己是否添加过最新的地址。

我们都知道,收货地址最重要的就是地址+电话了,通过这个可以确定一个人。因为有些英雄美女喜欢把姓名写成: 喵星人,吴彦祖这样的,所以只要确保地址和电话对得上就行。
那我们就需要比较地址是否有重复的,这样就好好管理自己的收货地址嘛。
代码里的收货地址
我们定义一个Receiver类,里面有name/address/mobile3个字段:
class Receiver(object):
def __init__(self, name, addr, mobile):
self.name = name
self.addr = addr
self.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 = name
self.addr = addr
self.mobile = mobile
def __eq__(self, other):
return self.addr == other.addr and self.mobile == other.addr
if __name__ == "__main__":
r = Receiver("小孟", "梅苑小区", 13922222222)
r2 = Receiver("小孟", "梅苑小区", 13922222222)
print(r == r2)

扩展
既然能够比较对象是否相等,那能否比较对象大小呢?那就等大家自己探索了,关键字:
lt, gt, ge, le
另外,还有__str__, __repr__, __hash__等方法,大家感兴趣也可以自己重写着玩玩。
Python小知识之对象的比较的更多相关文章
- [Python][小知识][NO.2] Python 字符串跨行连接,或拆分为多行显示
1.前言 又是一个字符串很长,但又是一种格式的小字符串直接连接而成的大字符串. 这么我们拆成多行,即美感,又易于我们修改. 例如 文件选择框中的 通配符: wildcard = "Pytho ...
- 5个有趣的Python小知识,结果令人意外
1 字符串驻留 如果上面例子返回True,但是下面例子为什么是False: 这与Cpython 编译优化相关,行为称为字符串驻留,但驻留的字符串中只包含字母,数字或下划线. 2 相同值的不可变对象 这 ...
- python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)
class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...
- Python 小知识 杂七杂八 随手记
1.assert 断言语句 例1: print ‘11111111111’ assert 1==2 print ‘22222222’ 如果没有 assert 程序会输出 ‘1111111111 ...
- python小知识,字典
知识融合在代码中 """ create:2020年12月20日 功能:字典的部分使用方法 """ #空字典 dic={} print(&qu ...
- python 小知识
PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找. 使用下面的代码可以打印PYTHONPATH: print(os.sys.path) impr ...
- [Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件
1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...
- [Python][小知识][NO.4] wxPython 字体选择对话框(O.O 不知道放到那里就放到这个分类的)
1.前言 O.O 前两天回家浪了两天,断更了 哎~~~ o.o 有时候,有木有想改标签或编辑框中内容的字体呀?(o.o 反正我是没有). wxpython也可以说是所在的操作系统,有字体选择器,给我们 ...
- python小知识——__name__ = '__main__' 的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
随机推荐
- tensorflow saver简介+Demo with linear-model
tf.train.Saver提供Save和Restore Tensorflow变量的功能,常用于保存.还原模型训练结果,这在自己的训练和迁移学习中都很有用. 训练.保存脚本: import tenso ...
- vue 手机号码隐藏中间
template {{ phone | mobileFilter }} data export default { filters:{ mobileFilter(val){ ...
- vue引用 element-ui 的 el-aside -> el-menu -> el-menu-item 路由侧边栏跳转链接,接上动态路由
npm 下载 npm i element-ui -S Vue main.js //引入element-ui的包 import ElementUI from 'element-ui'; //引入el ...
- shutdown 命令
# shutdown -h #停止系统服务并关机 -r #停止系统服务后重启 shutdown -h now #立即关机 shutdown -h 10:53 #到10:53关机,如果该时间小于当前时间 ...
- 剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某 ...
- Spring AOP 事务配置(实现转账事务)
1. 事务特性 事务特性:ACID 原子性:整体 [原子性是指事务包含的所有操作要么全部成功,要么全部失败] 一致性:数据 [一个事务执行之前和执行之后都必须处于一致性状态] 隔离性:并发 [对于任意 ...
- GridControl常用操作
显示分组面板 gridView1.OptionsView.ShowGroupPanel = true; 是否开启多选 gridView1.OptionsSelection.MultiSelect = ...
- Docker 容器间的单向连接
Docker 容器间的单向连接 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:Dockerfile 自动制作 Docker 镜像( ...
- mybatis一对多联表查询的两种常见方式
1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为 ...
- PHP中的文件系统函数(一)
从这篇文章开始,我们将学习一系列的 PHP 文件系统相关函数.其实这些函数中,有很多都是我们经常用到的,大家并不需要刻意地去记住它们,只要知道有这么个东西,在使用的时候记得来查文档就可以了. 文件路径 ...