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){};/ ...
随机推荐
- 将 Python 打包的 exe 进行反编译
Python 打包成 exe 之后,是否能从二进制文件中恢复出源代码?没有加密的话是可以的. 首先需要解包. 直接从 github 上下载就行:https://github.com/counterce ...
- Java 获取资源文件路径
1 问题描述 通过源码运行时,一般使用如下方式读取资源文件: String str = "1.jpg"; 资源文件与源码文件放在同一目录下,或者拥有同一父级目录: String s ...
- SOAP与REST API的区别
之前一直想写些RESTful相关的文章,却一直未付诸行动.直到最近接手一个新的项目,对这块重新温习,乘此机会写些相关帖子.欢迎大家评论留言,如有错漏之处,也望各位大佬不令赐教. 话不多说,干活顶上. ...
- 安全高效跨平台的. NET 模板引擎 Fluid 使用文档
Liquid 是一门开源的模板语言,由 Shopify 创造并用 Ruby 实现.它是 Shopify 主题的主要构成部分,并且被用于加载店铺系统的动态内容.它是一种安全的模板语言,对于非程序员的受众 ...
- 【ORM】Mybatis与JPA的区别
Mybatis与JPA的区别: 1.ORM映射不同: Mybatis是半自动的ORM框架,提供数据库与结果集的映射: JPA(Hibernate)是全自动的ORM框架,提供对象与数据库的映射: 2.可 ...
- 洛谷P1553 数字反转(升级版)
题目简介 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对 ...
- C#-宽带连接
public static string Connect(string UserS,string PwdS) { string arg = @"rasdial.exe 宽带连接" ...
- Python爬虫之requests库的使用
requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 "HTTP for ...
- React-列表 & Key
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- Portswigger web security academy:DOM-based vulnerabilities
DOM-based vulnerabilities 目录 DOM-based vulnerabilities 1 - DOM XSS using web messages 2 - DOM XSS us ...