📜  python 使对象可散列 - Python (1)

📅  最后修改于: 2023-12-03 15:19:07.349000             🧑  作者: Mango

使Python对象可散列

在Python中,可散列对象(hashable objects)是指能够通过哈希(hash)函数进行映射的对象,例如字典中的键(key)。

Python中内置类型中具有可散列特性的有:数字(int, float等),字符串(str),元组(tuple),以及定义了__hash__方法并且不可变的自定义类(immutable user-defined classes)。

然而,当我们自己定义的类(包括不可变类和可变类)需要作为字典键或者集合元素时,通常会出现“unhashable type”异常。这是因为默认情况下Python无法确定如何把自定义的类映射到哈希表上。

那么,我们应该怎样才能使自定义类变得可散列呢?

我们可以通过重载__hash__和__eq__方法来自定义类的哈希值和判等规则,从而使其具有可散列的特性。

class MyClass:
    def __init__(self, val1, val2):
        self.val1 = val1
        self.val2 = val2

    def __hash__(self):
        return hash((self.val1, self.val2))

    def __eq__(self, other):
        if isinstance(self, other.__class__):
            return self.val1 == other.val1 and self.val2 == other.val2
        return False

在上面的示例中,我们定义了一个名为MyClass的类,该类包括两个属性val1和val2。我们通过重载__hash__和__eq__方法来使该类具有可散列属性。

在__hash__方法中,我们返回了由val1和val2组成的元组的哈希值。在__eq__方法中,我们首先判断另外一个对象(self)是否是MyClass的实例,如果是则比较两个对象的val1和val2是否相等,否则返回False。

通过这样的方式,我们便可以使自定义类具有可散列的属性,从而能够被用作字典键或者集合元素。

总结:

使Python对象可散列最简单的方式是将其设计为不可变对象,并定义__hash__和__eq__方法。如果对象是可变的,则需要保证其哈希值和判等规则不会发生变化,否则可能导致意外的结果。