python 判断对象是否相等以及eq函数

- 当对两个点的实例进行值的比较时,比如
p1=Point(1,1) p2=Point(1,2),判断p1==p2时__eq__()会被调用,用以判断两个实例是否相等。在上述代码中定义了只要x和y的坐标相同,两个点相等。需要注意,__eq__()对is不生效,==是比较的值,而is比较的是引用,也就是内存地址。举个例子,p1=Point(1,1) p2=Point(1,1),p1==p2为True,p1 is p2为False,只有p1 is p1为True。 - 在Python中对象分为可哈希对象和不可哈希对象,可哈希对象如字符串、数字、自定义的类、frozenset、元组,被称作不可变对象,不可哈希对象如字典、列表、集合,被称作可变对象。这里的不可变不是对象的值不可变,而是指对象创建后其hash值在其生命周期内不会改变。用函数
hash()取可哈希对象的hash值,只要是同一对象其hash值不会改变;而对不可哈希对象取hash值,例如对列表取hash值,会报错,返回TypeError: unhashable type: 'list'。可哈希对象因其hash值不变可以用作字典的key,而不可哈希对象则不行。
- 当需要对类的一个实例取其hash值时,会调用
__hash__()。一般来说,会把实例的所有属性打包成元组,返回其hash值,从而实现自定义__hash__()。在用set()去重时就是对比hash值是否一样,如果两个对象hash值一样代表重复。 - 用户定义的类默认带有
__eq__()和__hash__()方法;使用它们与任何对象(自己除外)比较必定不相等,并且x.__hash__()会返回一个恰当的值以确保x == y同时意味着x is y且hash(x) == hash(y)。 - 如果一个类没有定义
__eq__()方法,那么也不应该定义__hash__()操作;如果它定义了__eq__()但没有定义__hash__(),那么__hash__()会被隐式地设为None,这个类就变成了不可哈希对象。如果一个类定义了可变对象并实现了__eq__()方法,则不应该实现__hash__(),因为可哈希集的实现要求键的哈希集是不可变的。例如,Point类中添加一个属性li是一个列表,由于列表不可哈希所以强行放入包含属性的元组中并返回其哈希值会报错。 - 如果使用默认的
__hash__()则不论如何改变一个实例的值其hash值都不变;反之,使用本文这种自定义的__hash__()方法,实例的值改变后,hash值就会改变。因此,自定义__hash__()方法的类的实例不应该作为字典的key(强行作为key不会报错,但是改变实例的属性值会导致找不到key对应的value),key的哈希值必须唯一不可变,key的hash值改变会导致找不到key对应的value。
python 判断对象是否相等以及eq函数的更多相关文章
- python 判断是否是润年及函数封装
方法一, 从终端输入一个表示年份的整数,判断是否是闰年,是就打印xxx年是闰年,不是打印xxx年不是闰年 y = int(input('请输入一个年份:')) if (y % 4 == 0 and y ...
- Python 判断变量的类型
这里有两种方法.type 和isinstance import types aaa = 0 print type(aaa) if type(aaa) is types.IntType: print & ...
- JavaScript中判断对象类型方法大全1
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- JavaScript中判断对象类型的种种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- Python 文件对象
Python 文件对象 1) 内置函数 open() 用于打开和创建文件对象 open(name,[,mode[,bufsize]]) 文件名.模式.缓冲区参数 mode: r 只读 w 写入 a 附 ...
- 转 JavaScript中判断对象类型的种种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- js中判断对象类型的几种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- python --- 19 判断对象所属,区分函数和对象, 反射
一.判断对象所属 isinstance, type , issubclass 1.issubclass(x,y) 判断x是否是y 的子类 2.type(x) 精准返回x 的数据类型 3.isi ...
- 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...
随机推荐
- Boxes in a Line UVA - 12657
You have n boxes in a line on the table numbered 1...n from left to right. Your task is to simulat ...
- 浅谈 C# Assembly 与 IL (一):C# Assembly 与 Reflection
作者:Compasslg 前言 前一阵子想利用闲余时间写一个 Unity 游戏的翻译工具,主要是用于翻译一些内嵌在代码中的文本,最初想偷懒看了一下网上的教学推荐说可以先利用DnSpy.ILSpy等工具 ...
- Innodb中的快照读和当前读
一.前言 上篇文章记录了对MVCC的相关理解,其中有提到快照读.其实在MVCC并发控制中,读操作可以分为两类:快照读(snapshot read)和当前读(current read) 二.什么是快 ...
- 用html自己开发自己的串口TCP通讯调试软件
今天给大家介绍一个通讯工具,可以自己写html页面,自己写Js脚本实现数据收发. 本程序在不断完善中,请大家不要喷,多多理解,有意见只管提. 系列文章 概述 串口基础功能 TCP客户端收发 参数篇 串 ...
- 利用Xposed Hook打印Java函数调用堆栈信息的几种方法
本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374 在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看 ...
- php、jsp、asp和aspx的区别
目录 PHP JSP ASP ASP.NET PHP PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地借用C.Java 和 Perl 语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地 ...
- 深入浅出带你玩转sqlilabs(五)-布尔/延时盲注与二次注入
SQL测试-基于布尔,延时盲注 布尔,延时注入常用到的判断语句 regexp regexp '^xiaodi[a-z]' 匹配xiaodi及xiaodi...等 if if(条件,5,0) 条件成立 ...
- .NET之默认依赖注入
介绍 不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽象.简单的说就是为了更好的解耦.而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现 ...
- (Py练习)判断能被几个9整除
# 输入一个奇数,判断最少几个9除以该数的结果为整数 # 999999 / 13 = 76923 if __name__ == '__main__': zi = int(input("输入一 ...
- h5实现电子签名
前端需要引入:jSignature.min.js ,jquery-1.9.1.min.js前端 部分写法:body内加 <div id="signature">< ...