gpt4 book ai didi

python - 关于可哈希对象的解释需要解释

转载 作者:太空狗 更新时间:2023-10-29 20:19:15 24 4
gpt4 key购买 nike

Mark RansomSO question about hashes 上回答在这里:

[...] An object is hashable if it has a hash value which never changes during its lifetime. So by the official definition, anything mutable can't be hashable, even if it has a __hash__() function. My statement about both requirements being necessary is untrue, because being hashable already implies the requirement to be immutable.

我想确保我做对了 - 即使作为非母语人士 - 所以如果我做错了,我希望有人纠正我。

假设这个类

class Author(object):
def __init__(self, id, name, age):
self.id = id
self.name = name
self.age = age

def __eq__(self, other):
return self.id==other.id\
and self.name==other.name

def __hash__(self):
return hash(('id', self.id,
'name', self.name))

据我所知,__eq__ 允许我将此类的对象与 == 运算符进行比较。根据 Marks 的回答,我了解到,即使我的对象 peter = Author(1, "Peter", 33) 有一个 __hash__ 它也不可哈希,因为我可能会做一些事情像 peter.age = 43 这意味着它不是不可变的。所以我的 Author 类对象不可散列,因此不能用作字典中的键?我是对的还是看起来我需要更多解释? :-)

最佳答案

如果您 promise 永远不会重置此类的idname,则该类的实例是可散列的。你不能保证这些属性永远不会被重置,根据 Python 原则 "we are all consenting adults here" , 但提供重置 __hash__ 所依赖的属性的方法将是非常糟糕的风格。

例如,如果您在 Author 的实例上提供了一个 set_name 方法,但没有提供 set_id,那么该类的客户可以合理地假定__hash__ id 操作。

如果您想向 Author 的客户明确表示他们不应重置某些属性,您可以通过在其名称前添加一个 _ 来将其标记为私有(private)。如果您随后仍想使用其通用名称提供(只读)对该属性的访问,您可以将其设置为 property :

class Author(object):
def __init__(self, id, name, age):
self._id = id
self._name = name
self.age = age # ages tend to change, so mutable

id = property(lambda self: self._id)
name = property(lambda self: self._name)

def __eq__(self, other):
return self.id==other.id\
and self.name==other.name

def __hash__(self):
return hash(('id', self.id,
'name', self.name))

关于python - 关于可哈希对象的解释需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com