在类中重载__eq__

时间:2015-02-18 00:27:39

标签: python python-3.x overloading

我试图在类中重载==运算符,这是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。任何人都能弄明白为什么会这样吗?

2 个答案:

答案 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)