使用list.index
它时,使用比较运算符 ( ==
) 来检查项目是否相同,然后使用__eq__
方法,来自文档:
用户定义的类默认有__eq__()
和__hash__()
方法;与它们相比,所有对象都比较不相等(除了它们自己)并x.__hash__()
返回一个适当的值,这样就x == y
意味着x is y
和hash(x) == hash(y)
。
您可以通过以下方式证明这一点:
>>> class A(object):
... def __init__(self):
... self.x = 0
...
>>> a = A()
>>> a.x = 5
>>> b = a
>>> b == a
True
>>> c = copy.deepcopy(a)
>>> c == a
False
在 CPythonid()
中返回对象的内存地址,因此__eq__
如果 id 匹配则返回 true:
>>> id(a)
140389541757224
>>> id(b)
140389541757224
>>> id(c)
140389541757336
所以你只需要实现__eq__
方法和__ne__
:
比较运算符之间没有隐含的关系。的真理x==y
并不意味着它x!=y
是错误的。因此,在定义 时__eq__()
,还应该定义__ne__()
操作符的行为与预期一致。
>>> class A(object):
... def __init__(self):
... self.x = 0
... def __eq__(self, o):
... return self.x == o.x
... def __ne__(self, o):
... return self.x != o.x
...
>>> a = A()
>>> a.x = 5
>>> b = a
>>> c = copy.deepcopy(a)
>>> d = A()
>>> d.x = 4
>>> a == b
True
>>> a == c
True
>>> a is b
True
>>> a is c
False
>>> a == d
False
还要注意这一点:
如果一个类没有定义一个__eq__()
方法,它也不应该定义一个__hash__()
操作;如果它定义__eq__()
但未定义__hash__()
,则它的实例将不能用作可散列集合中的项目。