2016-11-16 67 views
0

我有一个类的多个实例。当某个属性匹配时,我认为两个类是相等的。 所有实例都在数组list = [a, b, c]中。我现在创建一个类d的新实例。当我做d in list itc输出false“in”如何检查会员资格?

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

+0

有你想用这个来解决的特殊问题,或者只是一般的好奇心? – Alex

+0

我试图解决我描述的问题 – Fuzzyma

+0

所以你想要的是,说你有一个随机类的实例列表。然后你在my_list中做'class',如果这个类至少有一个实例,它应该返回True。或者你想检查列表中类的任何特定实例吗? – Alex

回答

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 
+0

其实这就是我想知道的。谢谢! – Fuzzyma

1

in的行为基于__contains__()方法。让我们用一个例子看看:

class X(): 
    def __contains__(self, m): 
     print 'Hello' 

现在,当你在X()米做in你可以看到“你好”印刷

>>> x = X() 
>>> 1 in x 
Hello 
False 

由于每__contains__() document

对于对象不定义__contains__(),成员测试首先尝试通过__iter__()进行迭代,然后通过通过旧的序列迭代协议3210,参见this section in the language reference

+1

'contains'检查当我做'类中的某件事'时,而不是当我做'列入类时' – Fuzzyma

+2

@ Fuzzyma:'list'也有一个在其中定义的包含方法。当你在列表中上课时,班级的__contains__被称为 –

+0

这只是部分正确的。 – erip

1

docs

对于限定所述__contains__()方法用户定义的类,x in y为真,当且仅当y.__contains__(x)是真实的。

对于没有定义__contains__()而是定义__iter__()的用户定义的类,如果在y上迭代时生成了一个具有x == z的z值,则y中的x为真。如果在迭代过程中引发异常,就像引发异常一样。

最后,尝试旧式迭代协议:如果一个类定义了__getitem__(),则y中的x为真,当且仅当存在非负整数索引i时,使得x == y[i]以及所有较低的整数索引不提升IndexError例外。 (如果发生任何其他异常,就像引发该异常一样)。

+1

'contains'在类中检查'something'而不是'class in list'因此此答案不提供解决方案 – Fuzzyma

+0

否;它是正确的联想。 'x in y'〜='y .__包含__(x)'就像答案一样。 @Fuzzyma – erip

+1

兴奋。我的情况是“列表中的班级”。所以'list'的'__contains__'方法被调用。我无意使用标准列表以外的其他东西。完全没有正确答案 – Fuzzyma