重载__eq__一类

我试图重载一个类中的==操作符,这是init方法:重载__eq__一类

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

对于==是真实的,在初始化所有的值应该是相同的。所以如果我有test=Point(1,2,3),然后我有test2 = Point(1,2,3),那么test == test2应该返回True。但是,我有test=Point(1,2,3)test2=Point(1,1,3),这是返回True。任何人都可以弄清楚为什么这是?

回答:

您正在测试是否self['a'] == right['a']什么时候你想要的是self.a == right.a。你应该使用getattr函数来做你想做的事情。

回答:

当前,迭代遍历字段时所有代码都会打印出索引。它只会为不同类型的对象返回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)

以上是 重载__eq__一类 的全部内容, 来源链接: utcz.com/qa/261116.html

回到顶部