1.其中涉及__hash__与__eq__这两个内置方法.

2.列如: 要求用类生成多个对象,其中姓名和性别相同的对象可认为是同一个人,用set原理做去重

class People:

def __init__(self,name,age,sex):

self.name=name

self.age=age

self.sex=sex

def __hash__(self):         对象找自带的hash算法,原set的算法是算全部,现在改为了算自定义的部分

res=hash(self.name+self.sex)

return  res                   返回的hash值和原数据类型做绑定再加入集合中,如需取出则给出原数据类型

def __eq__(self,other):   发现重复的hash值自动触发,并把重复的这两个拿出来做对比

if self.name+self.sex==other.name+other.sex:   原set对比的是全部,现在对比的是自定义的部分

return  True              如返回True则抛弃,Flase则重新计算并加入.

people_lis=[]

for  i  in  range(1,200):

people_lis.append(People(‘张三’, i ,’男’))

for  i  in  range(1,200):

people_lis.append(People(‘李四’, i ,’女’))

for  i  in  people_lis:

print(i.__dict__)

个人理解:首先,这个东西要先搞明白集合的运行原理,或者说去重原理吧. set(可迭代对象).

1.先说集合的原理吧.集合自带有类似于for循环的机制,会把放入其中的可迭代对象中的元素依次拿出来用

自带的__hash__做hsah(元素)的算法,然后在内存中把其保存为:元素名+指向的形式(指向什么呢?指向的就

是存放hash值的格子),当循环到某个元素的时候发现其Hash出来的值对应的格子已经有东西了,这时

候会生成:(当前元素==已存在的hash值对应的元素名)这样的一个形式来触发自带的__eq__方法,如果这

两个比较后的值为True,则抛弃当前元素不予处理.如果为Flase,则再次进行一系列运算,从而保证得到一个

不同的值再予以保存.

2.再来说说这个列子中的变化. 首先给了set一个可迭代的列表,set会利用自带的循环机制挨个拿出来列表

中的每个元素,然后用自带的hash算法准备给元素进行运算,此时必然是hash(元素)这么的一个形式,但是这

种形式在此列中还有另一层含义,那就是调用对象的hash函数的意思,对象本类此时就具有这个函数,于是

就走了对象自己的了,然而自己的hash算法是经过修改的,就是提取对象中某一部分来进行hsah运算,不做

对象整体的运算,运算完成后会在内存中保存成(完整对象名+修改算法后的指向).当下一次循环来的对象

提取相同部分做完运算,如发现该指向已然有东西了,set准备再次用==来对比当前对象和已存对象值是

否相同时( 此时形式为:当前对象==已存对象).这个形式的另一层意义就起作用了,这是要调set的__eq__

方法,对象本类就有该方法,于是走的就是本类的__eq__方法,但是本类的这个东西也是经过修改的,修改的

是对比对象中某一段的值是否相同,相同则抛弃不予处理,不同则存起来.

因自带的__hash__ 和 __eq__的运算标准修改成了对象中的姓名+性别的形式组成的字符串,所以运算时

只会运算这个字符串,所以成了姓名和性别相同的去重,而不管其余部分是否相同.

最新文章

  1. python 之 前端初识 html
  2. javase基础笔记2——数据类型和面向对象
  3. HDU 1715 大菲波数
  4. 【Asp.Net使用EasyUI】EasyUI combox实现联动
  5. 代码重启SQL命令
  6. 如何应用CLR线程池来管理多线程
  7. <二> ASP.NET AutoPostBack
  8. C语言练习题_邮票组合
  9. 模型类中 Parcelable 接口使用
  10. DOM2定位与高宽类属性专题学习【DOM专题学习系列(一)】
  11. eclipse tomcat内存设置
  12. 如何:对 Web 窗体使用路由
  13. tr删除替换详解
  14. zk command
  15. SuperWebClient -一个基于CURL的.NET HTTP/HTTPS模拟神组件(1)
  16. ArrayList add方法的实现之扩容
  17. 简易js进度条
  18. mysql数据库中指定值在所有表中所有字段中的替换
  19. ASP.NET MVC下使用AngularJs语言(九):日期时间处理与显示
  20. docker+phantomjs+haproxy 搭建phantomjs集群

热门文章

  1. Python爬取拉勾网招聘信息并写入Excel
  2. System.gc()和Runtime.gc()的区别?
  3. mysql派生查询必须有别名问题记录
  4. .net core EF Core 视图的应用
  5. Hyper V NAT 网络设置 固定IP / DHCP
  6. UWP 推荐 - 限时免费的RSS阅读器《RSS 追踪》登录 Windows 10
  7. VM1059 bootstrap-table.min.js:7 Uncaught TypeError: Cannot read property 'classes' of undefined
  8. Prometheus监控学习笔记之Prometheus如何热加载更新配置
  9. DevExpress的图形按钮菜单栏控件WindowsUIButtonPanel的布局、使用和设置按钮的点击事件
  10. 深度学习-TensorFlow2.0笔记(一)