我想列出我定义的对象列表,然后使用in
关键字(调用__contains__
)来确定Python列表中是否存在所述对象。
这是一个带注释的最小例子:
>>> class Foo(object):
... def __init__(self, name):
... self.name = name
... def __contains__(self, item):
... return self.name == item
...
>>> list_of_objects = [Foo("bar"), Foo("baz"), Foo("quux")]
>>> # I want to see if "bar" is in this list of Foo() objects
>>> Foo("bar") in list_of_objects
False # <-- I want this to be True
不应该in
关键字迭代Python列表并使用__contains__
方法来确定对象的存在吗?
如果对列表index()
功能的调用也可以运行,则会有额外的荣誉。
感谢@ user2357112,看起来答案是实现等价运算符__eq__
。将以下位添加到上一个示例中的Foo
类可以解决我遇到的问题。
>>> class Foo(object):
... def __init__(self, name):
... self.name = name
... def __eq__(self, other):
... return other.name == self.name
>>> list_of_objects = [Foo("bar"), Foo("baz"), Foo("quux")]
>>> Foo("bar") in list_of_objects
True
答案 0 :(得分:5)
__contains__
是在容器上调用的方法,而不是在元素上调用的方法。您需要实现__eq__
:
class Foo(object):
def __init__(self, name):
self.name = name
def __eq__(self, other):
if isinstance(other, Foo):
return other.name == self.name
return self.name == other
如果您要将Foo
存储在其他容器中(例如set
),请记住实施__hash__
。