我有一个类的多个实例。当某个属性匹配时,我认为两个类相等。
所有实例都在数组list = [a, b, c]
中。我现在创建一个所谓的类d
的新实例。当我d in list
时,它会输出false
。
我的问题是:使用in
时如何检查会员资格?这是正常的比较(这意味着我可以在我的类中使用__eq__
来实现类的相等性)?如果不是:如果某个类的某个属性等于?
in
匹配
答案 0 :(得分:2)
class Foo:
def __init__(self, x):
self.x = x
def __eq__(self, other):
if isinstance(other, Foo):
return self.x == other.x
a = [1,2,3,Foo(4),Foo(5)]
Foo(5) in a
>>>True
Foo(3) in a
>>>False
答案 1 :(得分:1)
in
的行为基于__contains__()
方法。让我们看一个例子:
class X():
def __contains__(self, m):
print 'Hello'
现在当您in
X()
>>> x = X()
>>> 1 in x
Hello
False
时,您可以看到“你好”。印刷
[Route("Index/{restaurants:System.Collections.Generic.List<RestaurantViewModel>}")]
对于未定义
__contains__()
的对象,成员资格测试首先通过__iter__()
尝试迭代,然后通过__getitem__()
尝试旧的序列迭代协议,请参阅this section in the language reference。< / p>
答案 2 :(得分:1)
来自docs:
对于定义
__contains__()
方法的用户定义类,x in y
当且仅当y.__contains__(x)
为真时才为真。对于未定义
__contains__()
但定义__iter__()
的用户定义类,如果在迭代y时产生一些带有x == z
的值z,则y中的x为真。如果在迭代期间引发异常,那就好像是在异常中引发异常。最后,尝试了旧式迭代协议:如果一个类定义
__getitem__()
,当y和x中的x为真,当且仅当存在非负整数索引i时才x == y[i]
,并且所有较低整数索引不会引发IndexError
异常。 (如果引发任何其他异常,就好像在异常中引发异常)。