我正在创建一个抽象数据类型,它创建一个双向链表(不确定它是正确的翻译)。在其中我创建了一个方法__len__以正确的方式计算它的长度,一个方法__repr__来正确地表示它,但我现在不想创建一个方法,当用户将使用类似的东西时:
if foo in liste_adt
将返回正确的答案,但我不知道该使用什么,因为__in__不起作用。
谢谢,
答案 0 :(得分:11)
您在寻找__contains__
吗?
object.__contains__(self, item)
被调用以实现成员资格测试运营商。如果 item 在 self中,则返回true,否则返回 false。对于映射对象,这应该考虑映射的键而不是值或键 - 项对。
对于未定义
__contains__()
的对象,成员资格测试首先通过__iter__()
尝试迭代,然后通过__getitem__()
尝试旧的序列迭代协议,请参阅this section in the language reference。< / p>
快速举例:
>>> class Bar:
... def __init__(self, iterable):
... self.list = list(iterable)
... def __contains__(self, item):
... return item in self.list
>>>
>>> b = Bar([1,2,3])
>>> b.list
[1, 2, 3]
>>> 4 in b
False
>>> 2 in b
True
注意:通常,当您遇到此类疑问时,可以在Data Model的The Python Language Reference部分找到引用。
答案 1 :(得分:1)
由于数据结构是链表,因此有必要对其进行迭代以检查成员资格。实施__iter__()
方法会使if in
和for in
都有效。如果有更有效的方法来检查成员资格,请在__contains__()
。