2012-02-24 111 views
4

我正在创建一个抽象数据类型,它创建一个双向链表(不确定它是否是正确的翻译)。在这个例子中,我创建了一个方法__len__来以正确的方式计算它的长度,__repr__方法可以正确表示它,但我现在不想创建一个方法,当用户做出这样的事情时:重新声明类中的方法“in”

if foo in liste_adt 

将返回正确的答案,但我不知道要使用什么,因为__in__不起作用。

谢谢

回答

11

您是否在寻找__contains__

object.__contains__(self, item)

调用来实现成员资格测试的运营商。如果项目自我,否则返回false。对于映射对象,这应该考虑映射的键而不是值或键项对。

对于不限定__contains__()目的,成员检测第一经由__iter__()尝试迭代中,然后经由__getitem__()旧序列迭代协议,请参阅this section in the language reference

简单的例子:

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

注:通常当你有这种怀疑的引用可以在The Python Language ReferenceData Model部分找到。

+0

这正是我一直在寻找,谢谢,并感谢文档链接,我在发布问题之前寻找这个问题 – lpostula 2012-02-24 09:47:33

+1

@kasmanit:不客气!这是我经常访问的PLR的一部分。 *(我总是忘记什么东西的实际名称)* :) – 2012-02-24 09:56:02

1

由于数据结构是一个链表,因此有必要遍历它来检查成员资格。实施__iter__()方法将使if infor in工作。如果有更有效的检查会员资格的方法,请在__contains__()中执行。