我正在創建一個抽象數據類型,它創建一個雙向鏈表(不確定它是否是正確的翻譯)。在這個例子中,我創建了一個方法__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