Recommended way to implement __eq__ and __hash__

时间:2017-07-18 10:51:26

标签: python equality hashable

The python documentation,如果您覆盖__eq__且对象是不可变的,则还应覆盖__hash__ in为了使课程适当可以使用。

在实践中,当我这样做时,我经常会得到像

这样的代码
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))

这有点重复,当另一个更新时,很有可能忘记更新一个。

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

2 个答案:

答案 0 :(得分:2)

回答我自己的问题。似乎执行此操作的一种方法是定义辅助__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())

答案 1 :(得分:0)

这相当于这个单行eq吗?

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