关于可清洗对象的说明需要说明

时间:2011-07-11 15:50:43

标签: python hash

Mark RansomSO 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中的键?我是否做得对或看起来是否需要更多解释? : - )

1 个答案:

答案 0 :(得分:11)

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

例如,如果您对set_name但没有Author的实例提供set_id方法,则该类的客户可以合理地假设__hash__运行仅{/ 1}}上的

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

_