字符串函数注册登录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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论