为什么我的平等方法总是返回false?

时间:2018-05-03 15:38:25

标签: python python-3.x

您好我刚刚开始在python中学习类,我正在尝试实现基于数组的列表。这是我的类和init构造函数。

class List:

def __init__(self,max_capacity=50):
    self.array=build_array(max_capacity)
    self.count=0

但是,我写了一个方法等于,如果列表等于另一个,则返回true。但是,它总是返回false。是的,我的追加方法正在发挥作用。

 def __eq__(self,other):
    result=False
    if self.array==other:
        result=True
    else:
        result=False
    return result

这是我测试它的方法,但它返回false?

a_list=List()
b_list=[3,2,1]
a_list.append(3)
a_list.append(2)
a_list.append(1)
print(a_list==b_list)

任何帮助将不胜感激!

编辑:

在得到所有有用的建议后,我发现我必须遍历其他和a_list并检查元素。

2 个答案:

答案 0 :(得分:3)

对于任何一个班级,

__eq__应该处理三种情况:

  1. selfother是同一个对象
  2. selfother是兼容的实例(最多只有鸭子类型:它们不需要是同一个类的实例,但应该支持相同的接口)
  3. selfother 可比较。
  4. 牢记这三点,将__eq__定义为

    def __eq__(self, other):
        if self is other:
            return True
        try:
            return self.array == other.array
        except AttributeError:
            # other doesn't have an array attribute,
            # meaning they can't be equal
            return False
    

    请注意,假设List实例应该与另一个对象进行比较,只要两个对象具有相同的array属性(无论这意味着什么)。如果这不是你想要的,你必须在你的问题中更具体。

    最后一个选项是回退到other == self,看看other的类型是否知道如何将自己与List类进行比较。平等应该是对称的,因此self == otherother == self应该产生相同的值,如果确实可以比较两个值的相等性。

    except AttributeError:
        return other == self
    

    当然,您需要注意,这不会导致Listtype(other)的无限循环反复推迟到另一个。

答案 1 :(得分:0)

您正在将实例中嵌入的数组(self.array)与其他对象的整体进行比较。这不会很好。

您需要将self.arrayother.array进行比较和/或在比较之前将两个对象转换为相同的类型。您可能还需要指定比较两个数组的含义(即,您需要一个布尔值来指示所有元素是否相等,而不是每个元素的布尔值数组)。

对于下面的代码,我假设您使用numpy ndarray作为self.array。如果没有,您可以编写自己的array_equal,将other转换为数组,然后比较数组的长度,然后返回(self.array==other_as_array).all()

如果要测试对象(相同类型,相同值)之间的严格相等性,可以使用:

from numpy import array_equal

import numpy as np
class List
    ...
    def __eq__(self, other):
        return isinstance(other, List) and array_equal(self.array, other.array)

如果您只想检查列表中项目的相等性,无论对象类型如何,那么您可以这样做:

def __eq__(self, other):
    if isinstance(other, List):
        return array_equal(array, other.array)
    else:
        return array_equal(self.array, other)