“in”如何检查会员资格?

时间:2016-11-16 13:18:27

标签: python

我有一个类的多个实例。当某个属性匹配时,我认为两个类相等。 所有实例都在数组list = [a, b, c]中。我现在创建一个所谓的类d的新实例。当我d in list时,它会输出false

我的问题是:使用in时如何检查会员资格?这是正常的比较(这意味着我可以在我的类中使用__eq__来实现类的相等性)?如果不是:如果某个类的某个属性等于?

,如何才能实现in匹配

3 个答案:

答案 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__() document

  

对于未定义__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异常。 (如果引发任何其他异常,就好像在异常中引发异常)。