我正在使用python 3.6。创建两个列表。如果所有实例属性值都相同,我想对其进行过滤。
我写了这段代码,但返回false。 如何过滤?
class MyCls:
def __init__(self, **kwargs):
self.x = kwargs.get('x')
self.y = kwargs.get('y')
self.z = kwargs.get('z')
def __str__(self):
return str(self.__dict__)
def __hash__(self):
return hash(str(self.__dict__))
def __eq__(self, other):
return str(self.__hash__) == str(other.__hash__)
a = MyCls(x='a', y='b', z='c')
b = MyCls(x='a', y='b', z='c')
ab = [a, b]
print(a is b)
# False
print(a == b)
# False
s = set(ab)
print(s)
# print(2 instances)
答案 0 :(得分:4)
我回答的前提是您出于教育目的而玩__hash__
和__eq__
。
我发现您的哈希和相等方法...很奇怪。
无论如何,您的代码的具体问题是__eq__
没有调用__hash__
方法。
您可以使用
return str(self.__hash__()) == str(other.__hash__())
在__eq__
中-或更高(但仍然很奇怪)
return hash(self) == hash(other)
通过此调整,您将得到
>>> hash(a)
>>> 8280333490847949293
>>> hash(b)
>>> 8280333490847949293
>>> a == b
>>> True
但是,此设计的一个基本缺陷是MyClass
的实例将与意外地对其进行哈希处理的任何其他对象进行比较。
>>> class C:
...: def __hash__(self):
...: return 8280333490847949293
...:
>>> C() == a
>>> True
如果要比较实例属性,为什么不直接比较实例字典呢?