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等。
2. 不是因为能hash的复杂类型是tuple,所以一般将其他作为hash值。首先要明白用来hash的值用的是不变量,即常量值,所以你用任何复杂的类型来作为hash值都行,只要计算上是不变值即可以,所以你也可以用字符串,用其他集合set来作为hash计算。hash计算要在语义上对两个不同实例有区别度才有意义,即不一定要联合所有属性来计算一个实例的hash值,例如如果实例有一个类似于身份证号码的唯一id属性,绝大部分情况下只用这个唯一id来计算hash值才合理,你联合唯一id和名字来计算hash值反而成了问题所在,即两个相同id的robot本该是可判断为同一个实例,但因为不同的name值被用到了hash计算中,导致了错误的判断。
3. __是python中魔法方法的约定规则,python中是没公有,私有方法的语言层面区分和语法限制的, 只是告诉大家请请请不要手动调用__开头的方法,你如果硬要这么做,你不符合道德,但你并没有违法。这点不同于java,.net等。