2017-07-18 62 views
-1

python documentation提到,如果您覆盖__eq__并且该对象是不可变的,则还应该覆盖__hash__以使该类可以正确哈希。推荐的方法来实现__eq__和__hash__

在实践中,我这样做时,我经常与代码落得像

class MyClass(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def __eq__(self, other): 
     if type(other) is type(self): 
      return (self.a == other.a) and (self.b == other.b) 
     else: 
      return False 

    def __hash__(self): 
     return hash((self.a, self.b)) 

这有点重复,并没有忘记更新一个当对方更新的一个明确的风险。

是否有推荐的方法一起实施这些方法?

回答

0

回答我自己的问题。似乎执行此操作的一种方法是定义辅助功能__members函数并将其用于定义__hash____eq__。这样就没有重复:

class MyClass(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def __members(self): 
     return (self.a, self.b) 

    def __eq__(self, other): 
     if type(other) is type(self): 
      return self.__members() == other.__members() 
     else: 
      return False 

    def __hash__(self): 
     return hash(self.__members()) 
相关问题