网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月03日漏签0天
python吧 关注:476,074贴子:1,972,369
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回python吧
>0< 加载中...

老哥,看下我对 __hash__ 理解对不

  • 只看楼主
  • 收藏

  • 回复
  • 夜不谢幕
  • 秀才
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


如图,红线框的这个位置有点懵,网上查了下,我的理解是 __hash__ 和 __init__ 类似,创建 robot 实例时自动调用,同时因为能 hash() 的复杂数据类型是 tuple,所以通常 __hash__ 返回这个对象全部属性值的 tuple,实现一个对象实例对应一个哈希字符串。

自定义左右两条下划线的方法没咋见过,所以内建了个 hash_where 方法想间接调用 __hash__,然后又试了下这玩意可以直接调用并不是私有的,robot.__hash__() 和 hash(robot) 结果一致。


  • 大蕃茄002
  • 举人
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1. __hash__与__init__调用时候是不同的,init是实例化时调用,这个没错。hash是被用到时才调用的,例如将你的robot实例作为字典的key值时,即mydict[robot]=222这样,字典的内部操作此时才会调robot的hash函数得到其返回值从而确定是否含有相同key。
2. 不是因为能hash的复杂类型是tuple,所以一般将其他作为hash值。首先要明白用来hash的值用的是不变量,即常量值,所以你用任何复杂的类型来作为hash值都行,只要计算上是不变值即可以,所以你也可以用字符串,用其他集合set来作为hash计算。hash计算要在语义上对两个不同实例有区别度才有意义,即不一定要联合所有属性来计算一个实例的hash值,例如如果实例有一个类似于身份证号码的唯一id属性,绝大部分情况下只用这个唯一id来计算hash值才合理,你联合唯一id和名字来计算hash值反而成了问题所在,即两个相同id的robot本该是可判断为同一个实例,但因为不同的name值被用到了hash计算中,导致了错误的判断。
3. __是python中魔法方法的约定规则,python中是没公有,私有方法的语言层面区分和语法限制的, 只是告诉大家请请请不要手动调用__开头的方法,你如果硬要这么做,你不符合道德,但你并没有违法。这点不同于java,.net等。


2025-08-03 23:36:45
广告
不感兴趣
开通SVIP免广告
  • 一周休七日
  • 吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
https://docs.python.org/zh-cn/3/reference/datamodel.html#special-method-names


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回python吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示