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判断IP地址合法性的方法实例
Mar 13 Python
python执行外部程序的常用方法小结
Mar 21 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
Python中join函数简单代码示例
Jan 09 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
Python各协议下socket黏包问题原理
Apr 12 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插入排序法实现数组排序实例
2015/02/16 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
取得传值的函数
2006/10/27 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
javascript操作数组详解
2014/12/17 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python中eval与int的区别浅析
2019/08/11 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
Django封装交互接口代码
2020/07/12 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
会计电算化个人自我评价
2013/11/17 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
家属答谢词
2015/01/05 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB