Python——dict(自定义类作key)
Python的dict要求key为不可变数据类型,通常采用str或int,但在某些应用场景下,需要采用自定义类型对象作key,
此时的自定义类需要实现两个特殊方法:__hash__、__eq__,用于哈希值的获取和比较
定义狗类:
class Dog():
def __init__(self,name,color):
self._n = name
self._c = color
def __hash__(self):
return hash(self._n + self._c)
def __eq__(self,other):
return (self._n,self._c)==(other._n,other._c)
定义房子:
from dog import Dog
dog_1 = Dog(name = 'mike',color = 'red')
dog_2 = Dog(name = 'tom',color = 'blue')
dog_3 = Dog(name = 'tom',color = 'blue')
#房子里有两只狗
house = {}
house[dog_1] = 1
house[dog_2] = 2
#每只狗对应的哈希值
print(hash(dog_1))
print(hash(dog_2))
print(hash(dog_3))
#输出每只狗的编号
for item in house:
print(house[item])
#名字和颜色相同的狗是同一只
print(house[dog_3]==2) >>1019109570234974571
>>5676435319618840106
>>5676435319618840106
>>1
>>2
>>True
参考:
http://www.mamicode.com/info-detail-495084.html
https://blog.csdn.net/woshiaotian/article/details/20286149
Python——dict(自定义类作key)的更多相关文章
- Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?
这是因为Python3中,str的输出是调用类的实例方法__str__来输出,如果__str__方法没有重写,则自动继承object类的__str__方法,而object类的__str__方法是调用_ ...
- 第8.16节 Python重写自定义类的__str__方法
一. 引言 上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息.而__str__方法是为最终用户返回类的相关 ...
- 第8.15节 Python重写自定义类的__repr__方法
一. 引言 前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中, ...
- python中自定义类对象json字符串化的方法
1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...
- Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?
在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- (转).Net中自定义类作为Dictionary的key详解
在定义数据结构时,Dictionary提供了快速查找数据的功能,另外Dictionary< TKey, TValue >属于key-value键值对数据结构,提供了泛型的灵活性,是数据结构 ...
- Python: 自定义类对象序列化为Json串
之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonTool class Score: math = ...
- python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05
反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...
随机推荐
- vue 给 图片添加一个默认图片
<img v-bind:src="userData.photo" :onerror="logo" class="img-box4"&g ...
- grep console
FF6464 9F6B00 8A8A00 4B5E76 8A7674 980B4F 980B4F
- js匀速运动
匀速运动 封装匀速运动原理:设置定时器,将传入的ele,设定一个速度,使用定时器获取当前时间的一个位置,加上速度值,给回节点,当节点到达目标位置,判断给他清除定时器. 匀速效果地址:http ...
- js作用域及闭包
作用域 执行环境是js最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为. 1.全局执行环境就是最外围的一个执行环境,每一个函数都有自己的作用域 2.简单的说局部作用 ...
- kettle在linux下执行任务
1.下载 最新版下载 7.1 https://community.hitachivantara.com/docs/DOC-1009855 准备 上传任务文件 .kjb,.ktr 上传mysql 驱动 ...
- netty---------write flush两个方法到底做了什么?
上一篇已经看到:unsafe的read方法,把channel中的数据read到byteBuff中的byteBuffer里.那么根据猜想,下面要进行的应该是nio 的 channel的write(byt ...
- 2019-02-22 L231
Scientists at the Massachusetts Institute of Technology have said lobsters could be key to creating ...
- L256 翻译
Should work be placed among the causes of happiness or be regarded as a burden? Much work isexceedin ...
- 继承and派生
1.什么是继承?(python2与python3) 在程序中继承是一种新建子类的方式,新创建的类称之为子类\派生类,被继承 的类称之为父类\基类\超类 继承描述的是一种遗传关系,儿子可以重用爹的属性 ...
- 联想 Lenovo PWR-G60 无线掌中宝拆机
从朋友那里弄了台Lenovo PWR-G60,现在已经停产了,淘宝上某店卖的国产WIFI Pineapple貌似就是拿这个刷的,打算出篇DIY教程 现在人在外地,编程器.热风枪.烙铁工具啥的都没有,更 ...