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中分数的相关使用教程
Mar 30 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
彻底搞懂Python字符编码
Jan 23 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
Python 一句话生成字母表的方法
Jan 02 Python
python实现抖音点赞功能
Apr 07 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
用Python提取PDF表格的方法
Apr 11 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
python_tkinter弹出对话框创建
Mar 20 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中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
小程序转发探索示例
2019/02/19 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
如何基于python实现脚本加密
2019/12/28 Python
Python 列表反转显示的四种方法
2020/11/16 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
小学后勤管理制度
2014/01/14 职场文书
公共场所标语
2014/06/30 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
《确定位置》教学反思
2016/02/18 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
导游词之日本富士山
2020/01/06 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js