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 相关文章推荐
探寻python多线程ctrl+c退出问题解决方案
Oct 23 Python
python映射列表实例分析
Jan 26 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
Python调用.NET库的方法步骤
Dec 27 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 Python
浅谈python数据类型及其操作
May 25 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
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python httplib,smtplib使用方法
2008/09/06 Python
Python中的作用域规则详解
2015/01/30 Python
Python中的高级数据结构详解
2015/03/27 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python 列表理解及使用方法
2017/10/27 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
python pytest进阶之fixture详解
2019/06/27 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
银行实习人员自我鉴定
2013/09/22 职场文书
员工拓展培训方案
2014/02/15 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android