实施 __eq__ 和 __hash__ 的推荐方法
Recommended way to implement __eq__ and __hash__
python documentation 提到如果您重写 __eq__
并且对象是不可变的,您还应该重写 __hash__
以便 class 可以正确散列。
在实践中,当我这样做时,我经常以这样的代码结束
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))
这有些重复,显然存在更新另一个时忘记更新一个的风险。
是否有推荐的方法来一起实施这些方法?
回答我自己的问题。执行此操作的一种方法似乎是定义辅助 __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())
这是否相当于这个单行eq?
def __eq__(self, other):
return type(other) is type(self) and (self.a == other.a) and (self.b == other.b)
我认为你可以使用用户定义的哈希函数更好。
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, self.b) == (other.a, other.b)
else:
return NotImplemented
def __hash__(self):
return hash((self.a, self.b))
python documentation 提到如果您重写 __eq__
并且对象是不可变的,您还应该重写 __hash__
以便 class 可以正确散列。
在实践中,当我这样做时,我经常以这样的代码结束
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))
这有些重复,显然存在更新另一个时忘记更新一个的风险。
是否有推荐的方法来一起实施这些方法?
回答我自己的问题。执行此操作的一种方法似乎是定义辅助 __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())
这是否相当于这个单行eq?
def __eq__(self, other):
return type(other) is type(self) and (self.a == other.a) and (self.b == other.b)
我认为你可以使用用户定义的哈希函数更好。
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, self.b) == (other.a, other.b)
else:
return NotImplemented
def __hash__(self):
return hash((self.a, self.b))