我正在创建一个抽象数据类型,它创建一个双向链表(不确定它是否是正确的翻译)。在这个例子中,我创建了一个方法__len__来以正确的方式计算它的长度,__repr__方法可以正确表示它,但我现在不想创建一个方法,当用户做出这样的事情时:重新声明类中的方法“in”
if foo in liste_adt
将返回正确的答案,但我不知道要使用什么,因为__in__不起作用。
谢谢
我正在创建一个抽象数据类型,它创建一个双向链表(不确定它是否是正确的翻译)。在这个例子中,我创建了一个方法__len__来以正确的方式计算它的长度,__repr__方法可以正确表示它,但我现在不想创建一个方法,当用户做出这样的事情时:重新声明类中的方法“in”
if foo in liste_adt
将返回正确的答案,但我不知道要使用什么,因为__in__不起作用。
谢谢
您是否在寻找__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 Reference的Data Model部分找到。
由于数据结构是一个链表,因此有必要遍历它来检查成员资格。实施__iter__()
方法将使if in
和for in
工作。如果有更有效的检查会员资格的方法,请在__contains__()
中执行。
这正是我一直在寻找,谢谢,并感谢文档链接,我在发布问题之前寻找这个问题 – lpostula 2012-02-24 09:47:33
@kasmanit:不客气!这是我经常访问的PLR的一部分。 *(我总是忘记什么东西的实际名称)* :) – 2012-02-24 09:56:02