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中的strftime()方法的使用
May 22 Python
Django URL传递参数的方法总结
Aug 28 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
Python多图片合并PDF的方法
Jan 03 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
pytorch 实现查看网络中的参数
Jan 06 Python
Python读写操作csv和excle文件代码实例
Mar 16 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
用python进行视频剪辑
Nov 02 Python
Python实现滑雪小游戏
Sep 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
给多个地址发邮件的类
2006/10/09 PHP
php 结果集的分页实现代码
2009/03/10 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python 中文字符串的处理实现代码
2009/10/25 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
Python中包的用法及安装
2020/02/11 Python
Python 实现一个简单的web服务器
2021/01/03 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
中文教师求职信
2014/02/22 职场文书
学习经验交流会主持词
2014/04/01 职场文书
应届生面试求职信
2014/07/02 职场文书
单位工作证明书格式
2014/10/04 职场文书
学习十八大标语
2014/10/09 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
初中毕业生感言
2015/07/31 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang