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中非常实用的一些功能和函数分享
Feb 14 Python
python简单实现基数排序算法
May 16 Python
Python复制文件操作实例详解
Nov 10 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
Python判断两个对象相等的原理
Dec 12 Python
PHP实现发送和接收JSON请求
Jun 07 Python
python微信好友数据分析详解
Nov 19 Python
python实现文本界面网络聊天室
Dec 12 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
Python 多线程共享变量的实现示例
Apr 17 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
selenium判断元素是否存在的两种方法小结
Dec 07 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 cout<<的一点看法
2010/01/24 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python实现DES加密解密方法实例详解
2015/06/30 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
python中实现控制小数点位数的方法
2019/01/24 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
Python调用Windows命令打印文件
2020/02/07 Python
python右对齐的实例方法
2020/07/05 Python
如何在python中判断变量的类型
2020/07/29 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
北京SQL新华信咨询
2016/09/30 面试题
日期和时间问题
2015/01/04 面试题
汉语言文学职业规划
2014/02/14 职场文书
出生公证委托书
2014/04/03 职场文书
社区母亲节活动总结
2015/02/10 职场文书
三下乡个人总结
2015/03/04 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
民主生活会主持词
2015/07/01 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电