我有一个类的多个实例。当某个属性匹配时,我认为两个类是相等的。 所有实例都在数组list = [a, b, c]
中。我现在创建一个类d
的新实例。当我做d in list
itc输出false
。“in”如何检查会员资格?
我的问题是:使用in
时如何检查会员资格?这是正常的比较(这意味着我可以在我的班级中使用__eq__
实现类的平等)?如果不是的话:如果某个类的某个属性等于,我该如何实现in
匹配?
我有一个类的多个实例。当某个属性匹配时,我认为两个类是相等的。 所有实例都在数组list = [a, b, c]
中。我现在创建一个类d
的新实例。当我做d in list
itc输出false
。“in”如何检查会员资格?
我的问题是:使用in
时如何检查会员资格?这是正常的比较(这意味着我可以在我的班级中使用__eq__
实现类的平等)?如果不是的话:如果某个类的某个属性等于,我该如何实现in
匹配?
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
其实这就是我想知道的。谢谢! – Fuzzyma
in
的行为基于__contains__()
方法。让我们用一个例子看看:
class X():
def __contains__(self, m):
print 'Hello'
现在,当你在X()
米做in
你可以看到“你好”印刷
>>> x = X()
>>> 1 in x
Hello
False
对于对象不定义
__contains__()
,成员测试首先尝试通过__iter__()
进行迭代,然后通过通过旧的序列迭代协议3210,参见this section in the language reference。
从docs:
对于限定所述
__contains__()
方法用户定义的类,x in y
为真,当且仅当y.__contains__(x)
是真实的。对于没有定义
__contains__()
而是定义__iter__()
的用户定义的类,如果在y上迭代时生成了一个具有x == z
的z值,则y中的x为真。如果在迭代过程中引发异常,就像引发异常一样。最后,尝试旧式迭代协议:如果一个类定义了
__getitem__()
,则y中的x为真,当且仅当存在非负整数索引i时,使得x == y[i]
以及所有较低的整数索引不提升IndexError
例外。 (如果发生任何其他异常,就像引发该异常一样)。
有你想用这个来解决的特殊问题,或者只是一般的好奇心? – Alex
我试图解决我描述的问题 – Fuzzyma
所以你想要的是,说你有一个随机类的实例列表。然后你在my_list中做'class',如果这个类至少有一个实例,它应该返回True。或者你想检查列表中类的任何特定实例吗? – Alex