Mark Ransom在SO question about hashes处回答了SO:
[...] An 如果对象具有在此期间永远不会更改的哈希值,则该对象是可清除的 它的一生。因此,根据官方定义,任何可变的东西都不能 即使它具有
__hash__()
功能,也可以清洗。我的声明 关于两个必要的要求是不真实的,因为存在 hashable已经暗示要求是不可变的。
我想确保,我做对了 - 即使是非母语人士 - 所以我希望有人在我弄错的时候纠正我。
假设这门课
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
的对象是不可编辑的,因此不能用作例如dictionarys中的键?我是否做得对或看起来是否需要更多解释? : - )
答案 0 :(得分:11)
如果您承诺永远不会重置id
或name
,则此类的实例是可清除的。您不能保证这些属性永远不会被"we are all consenting adults here"的Python原则重置,但提供重置__hash__
依赖的属性的方法将是非常糟糕的风格。
例如,如果您对set_name
但没有Author
的实例提供set_id
方法,则该类的客户可以合理地假设__hash__
运行仅{/ 1}}上的。
如果您想向id
的客户明确说明他们不应重置某些属性,您可以通过在Author
前添加一个属性来将其标记为私有。如果您仍希望使用其通用名称提供(只读)对该属性的访问权限,则可以将其设为property:
_