http://www.yihaomen.com/article/python/281.htm

比较python类的两个instance(对象) 是否相等

作者:轻舞肥羊 日期:2012-10-25

字体大小: 小 中 大
 

对于同一个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 相同的对象,就认为是相等的对象呢,有如下几种方法:
一.重载 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__系统内置方法来实现。

转载于:https://www.cnblogs.com/saolv/p/9839626.html

比较python类的两个instance(对象) 是否相等相关推荐

  1. python类私有函数_python-面向对象-14-私有方法

    1私有方法说明 python对于类的成员没有严格的访问控制限制,这与强类型面向对象语言有区别.关于私有属性和私有方法,有如下要点: 通常我们约定,两个下划线开头的方法属于是私有的(private)方法 ...

  2. 根据创建的School类创建两个学校对象,为对象属性赋值,并调用相应方法。

    //School类 //学校类 public class School {     //属性:学校名  教室数目   学生数量     String schoolName;     int class ...

  3. 定义一个Circle类,根据圆的半径求周长和面积,再由Circle类创建两个圆对象,其半径分别为5和10,要求输出各自的周长和面积。

    class Circle:pi=3.14def __init__(self,radius):self.r=radiusdef girth(self):C=Circle.pi*self.r*2print ...

  4. 如何在python中找到两个日期时间对象之间的时差?

    本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...

  5. 【Python基础】07、Python类与面向对象

    一.面向对象编程(OOP) 程序=算法+数据结构=指令+数据 1.代码可以选择以指令为核心或以数据为核心进行编写 两种范型: 以指令为核心:围绕"正在发生什么"进行编写 面向过程编 ...

  6. python类、对象、方法、属性之类与对象笔记

    为什么80%的码农都做不了架构师?>>>    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... ...

  7. Python类与对象实验

    一.任务描述   本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. ...

  8. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  9. python类和对象_Python类和对象

    python类和对象 Python is an object-oriented programming language. Python Classes and Objects are the cor ...

最新文章

  1. @Autowired静态变量
  2. 奇迹暖暖服务器不稳定,闪耀暖暖用土豆当服务器?开服仅半小时就崩溃,无数玩家疯狂吐槽...
  3. 基于Lock的卖票和生产者消费者案例
  4. ip地址合法性检查 php,php检查验证IP为有效IP地址函数
  5. Python基础(19)_异常处理
  6. 互联网分布式微服务云平台规划分析--SSO单点登录系统
  7. 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)
  8. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
  9. java jtextfield 密码_Java Swing实战(三)文本组件JTextField和密码组件JPasswordField
  10. Python Flask Web 第十一课 —— 使用 Flask-SQLAlchemy 管理数据库
  11. kalilinux装到u盘上的弊端_暗黑系统安装盘高达14G!kali linux在它面前顿然失色
  12. E-Prime教程 | 打mark标记
  13. 关于U盘病毒autorun.inf更改文件夹属性为系统文件夹并隐藏文件夹
  14. 网络电视机顶盒的工作原理
  15. (17)全民小视频引流脚本模块化开发11-关注用户的粉丝By飞云脚本学院
  16. 制作游戏3D模型都有哪些步骤流程
  17. 关于Inter漏洞“熔断”的论文翻译(三)(完)
  18. 安卓Native Memory Leak(本地服务内存泄露)分析
  19. C语言:成绩等级划分!
  20. 它来啦,它来啦!三子棋小游戏来啦!!!

热门文章

  1. oracle管理认证方式,关于Oracle数据库管理员认证方法简述
  2. php服务器 下载,php实现从服务器下载文件
  3. java数组螺旋矩阵从上到下_Java-基础编程(螺旋矩阵乘法表)
  4. PHP使用Switch语句判断星座,PHP的switch判断语句的“高级”用法详解 用switch语句怎样判断成绩的等级...
  5. 深度学习(6)TensorFlow基础操作二: 创建Tensor
  6. 【算法竞赛学习】资金流入流出预测-挑战Baseline_数据探索与分析1
  7. vim 命令_Vim 操作命令手册
  8. 『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
  9. CF思维联系--CodeForces -214C (拓扑排序+思维+贪心)
  10. 对Android源码分析总结(Z)