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){};/ ...
随机推荐
- OkHttp配置HTTPS访问+服务器部署
1 概述 OkHttp配置HTTPS访问,核心为以下三个部分: sslSocketFactory() HostnameVerifier X509TrustManager 第一个是ssl套接字工厂,第二 ...
- 做个开源博客学习Vite2 + Vue3 (一)搭建项目
前言 不会 webpack,遇到报错就一头雾水,完全不知道怎么办,而且体积还大速度还慢. 所以尤雨溪做了 vite 后就很向往,只是知道自己水平有限还是等大佬先趟趟坑,等差不多了在跳. 现在vite2 ...
- H5小技巧之——巧用<a>标签锚链接(#锚点链接 #页面特定位置 #DOM定位 #hash路由中使用锚链接)
#作者:矩阵鱼--代码中游泳的咸鱼 前端开发中,常遇到定位到页面某特定位置的需求,JavaScript提供的el.scrollIntoView() 和 el.scrollIntoViewIfNeede ...
- 关于Snowflake 生成53位ID
1, bug现象: 没有经过处理的Snowflake 生成的是64位bit的唯一ID,但由于多数时候我们前台用到js,但是js只支持53位bit的数值.这样就导致了传到前台的64位的丢失精度. 解决思 ...
- jumpserver2
测试环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7 IP: 192.168 ...
- Python脚本与Metasploit交互攻击
Metasploit是一款强大的漏洞扫描和利用工具,编写Python脚本与Metasploit进行交互,可以自动化的扫描和利用漏洞. 相关文章:Metasploit框架的使用 在脚本中,我们首选需要利 ...
- maven下载Oracle jar包
Oracle的jar包由于是收费的,所以当我们使用maven去下载时下载不下来,对于这种情况,可以用以下方式去处理: oracle官网下载应用地址:https://www.oracle.com/dow ...
- dependencyManagement 版本管理
帮别人解决bug的时候碰到,随便记录一下. 使用<dependencyManagement>标签, 做版本管理的时候,需要父子项目关联,就需要子模块中利用<parent> 否则 ...
- ArrayList初步使用
️Practice the usage of ArrayList all of String with a exampe of NoteBook. ArrayList all of String的部分 ...
- ThinkPHP5.1 输出到模板HTML格式被强行转成了字符
出现问题 控制器传给视图一个input标签,在视图页面显示出来就是 <input type='text'></input>,显示出来的是一个文本,而不是一个可以输入的文本框 解 ...