有几种标准方法可以使类可散列,例如(借用SO):
# assume X has 2 attributes: attr_a and attr_b
class X:
def __key(self):
return (self.attr_a, self.attr_b)
def __eq__(x, y):
return isinstance(y, x.__class__) and x.__key() == y.__key()
def __hash__(self):
return hash(self.__key())
现在假设我有很多类要设为可散列。它们都是不可变的,具有不可变的属性,并且批量散列所有这些属性是可以接受的(对于具有太多属性的类,我们只想散列几个足以避免大多数冲突的属性)。我可以避免__key()
为每个班级手动编写方法吗?
__key()
为它们创建一个定义,__eq__
和的基类是个好主意__hash__
吗?特别是,我不确定找到所有应该进入的实例属性__hash__
是否可行。我知道这通常是不可能的,但在这种情况下,我们可以对对象进行更多假设(例如,它是不可变的 -__init__
完成后,它的属性都是可散列的,等等)。
(如果继承层次结构不起作用,也许装饰器会起作用?)