python实现比较类的两个instance(对象)是否相等的方法分析


Posted in Python onJune 26, 2019

本文实例讲述了python实现比较类的两个instance(对象)是否相等的方法。分享给大家供大家参考,具体如下:

对于同一个Class,可以创建不同的实例(instance), 如何比较这两个 instance 是否相等呢?我们知道,对于计算机来说,要判断两个对象是否相等,就是看在内存中的地址是否同一个。如果内存地址一样,那么肯定是相等的。这种情况通常出现在一个对象是另外一个对象的引用时出现。

但在实际的开发过程中,要比较两个对象是否相等,并不是通过内存地址来判断的,而是通过这两个对象的部分属性值,或者全部属性值来对比判断的。

假设有一个职员Class, 我们分别创建了两个对象

class Staff(object):
 def __init__(self,id,name,sex):
  self.id=id
  self.name=name
  self.sex=sex

我们这样认为,如果id 相同,则表示两个对象相等,id姑且表示身份证编号吧,如果身份证编号相同,那么肯定是同一人,在实际的项目中会遇到这样的情况。

创建对象并查看各自的内存地址

staff1=Staff("123456","张三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
#12327248 12327184

结果很明显,在不同的内存地址,这时候如果判断 staff1==staff2 ,结果肯定是  False

如何满足我们的需要,只要id 相同的对象,就认为是相等的对象呢,有如下几种方法:

1.重载 Staff Class 的 __eq__ 方法

class Staff(object):
 def __init__(self,id,name,sex):
  self.id=id
  self.name=name
  self.sex=sex
 def __eq__(self,other):
  return self.id==other.id
staff1=Staff("123456","张三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
print staff1==staff2
#True

结果返回为 true,说明是相等的,但在计算机中的内存地址,肯定是不一样的。这里重载了__eq__方法,当然你还可以 增加比较条件,例子中只对比了id. 用同样的方法,还可以实现 两个对象相加等操作,重载__add__ 方法。

2.直接属性值对比来实现

staff1=Staff("123456","张三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
print staff1.__dict__
print staff2.__dict__
if staff1.__dict__['id']==staff2.__dict__['id']:
 print 'yes,equal'

你会发现,这样也是可以的,同样也可以对比多个属性,这里的重点是用到了python Class 的 __dict__系统内置方法来实现。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
详解python 发送邮件实例代码
Dec 22 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
Python 加密的实例详解
Oct 09 Python
python实现list由于numpy array的转换
Apr 04 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
python实现WebSocket服务端过程解析
Oct 18 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
Python实现的ftp服务器功能详解【附源码下载】
Jun 26 #Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 #Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 #Python
对Python3之方法的覆盖与super函数详解
Jun 26 #Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 #Python
python装饰器常见使用方法分析
Jun 26 #Python
解决python super()调用多重继承函数的问题
Jun 26 #Python
You might like
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python 处理数据的实例详解
2017/08/10 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
keras中的History对象用法
2020/06/19 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
阿德的梦教学反思
2014/02/06 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
颁奖晚会主持词
2014/03/25 职场文书
辞职信的写法
2015/02/27 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
追悼词范文大全
2015/06/23 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
从原生JavaScript到React深入理解
2022/07/23 Javascript