2012-02-24 18 views
4

二重リンクリストを作成する抽象データ型を作成しています(正しい変換ではないかどうかはわかりません)。その中で、正しい方法でメソッドの長さを計算する__len__メソッドを作成しました。これを正しく表現するには__repr__メソッドを使用しましたが、ユーザーが次のようなメソッドを作成することは今のところできません:クラス内のメソッド "in"の再宣言

if foo in liste_adt 

は正しい答えを返しますが、__in__が機能していないため、何を使用するのか分かりません。

答えて

11

あなたが__contains__を探している、ありがとう!メンバーシップのテストオペレーターを実現するために呼び出され

object.__contains__(self, item)

アイテムの場合はtrue、それ以外の場合は falseを返します。マッピングオブジェクトの場合、これは値またはキー項目のペアではなくマッピングのキーを考慮する必要があります。 __getitem__()経由

__contains__()を定義していないオブジェクトの場合

、メンバーシップのテストは最初__iter__()を経由して反復をしようと、古いシーケンス反復プロトコル、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

+1

@kasmanit:ようこそ!それは私がより頻繁に訪れるPLRのセクションです。 *(私はいつも何かの実際の名前が何かを忘れる)* :) –

1

データ構造はリンクリストであるため、メンバーシップをチェックするために繰り返し処理する必要があります。 __iter__()メソッドを実装すると、if infor inの両方が機能します。メンバーシップをチェックするためのより効率的な方法がある場合は、__contains__()に実装してください。

関連する問題