我试图在类中重载==运算符,这是init方法:
class Point:
def __init__(self, a, b, c, d):
self.a = a
self.b = b
self.c = c
self.d = d
self._fields = ['a','b','c','d']
我试图重载==运算符,这是我的代码:
def __eq__(self,right):
if type(right) == type(self):
for i in self._fields:
print(self._fields.index(i))
else:
return False
return True
对于==为真, init 中的所有值都应相同。因此,如果我有test=Point(1,2,3)
,然后我有test2 = Point(1,2,3)
,那么test == test2应该返回True
。但是,我有test=Point(1,2,3)
和test2=Point(1,1,3)
,这将返回True
。任何人都能弄明白为什么会这样吗?
答案 0 :(得分:2)
您正在测试self['a'] == right['a']
当您想要的是self.a == right.a
时。您应该使用getattr
函数来执行您想要执行的操作。
答案 1 :(得分:1)
目前,迭代字段时所有代码都打印出索引。它只会为不同类型的对象返回False
。相反,您应该使用getattr
来获取与_fields
中的名称对应的实际属性值:
def __eq__(self, other):
return (self._fields == other._fields and
all(getattr(self, attr) == getattr(other, attr) for attr in self._fields)
请注意,我已经更改了具有相同类型的两个对象的测试,以检查它们是否具有相同的字段(这是一种鸭子类型)。如果你想坚持使用类型检查,我会使_fields
成为一个类属性,这样你就会知道每个实例都有相同的值。
或者,您可以完全取消_fields
属性,只需对属性名称进行硬编码:
def __eq__(self, other):
return (type(self) == type(other) and
self.a == other.a and self.b == other.b and
self.c == other.c and self.d == other.d)