您好我刚刚开始在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并检查元素。
答案 0 :(得分:3)
__eq__
应该处理三种情况:
self
和other
是同一个对象self
和other
是兼容的实例(最多只有鸭子类型:它们不需要是同一个类的实例,但应该支持相同的接口)self
和other
不可比较。牢记这三点,将__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 == other
和other == self
应该产生相同的值,如果确实可以比较两个值的相等性。
except AttributeError:
return other == self
当然,您需要注意,这不会导致List
和type(other)
的无限循环反复推迟到另一个。
答案 1 :(得分:0)
您正在将实例中嵌入的数组(self.array
)与其他对象的整体进行比较。这不会很好。
您需要将self.array
与other.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)