Python.use(better) 特殊メソッド __contains__

《前の記事|記事一覧|次の記事》
Python.use(better)


Python はじめました

特殊メソッド __contains__


《関連記事》

-

■ 特殊メソッド __contains__
$ python
Python 3.0.1 (r301:69597, Feb 14 2009, 19:03:52) 
...
>>> help(str.__contains__)
__contains__(...)
    x.__contains__(y) <==> y in x

メソッド __contains__ は、演算子 in に呼応して、オブジェクトの帰属関係を判定します。

□ 全項目を確認する

関数 do を利用すると、全ステップの「項目」を確認できます。

$ python -i special_method.py
>>> do()
@: tips_contains -- __contains__(...)
...
□ 各項目を実行する

関数 do に引数を指定すると、各ステップの「動作」を確認できます。

>>> do(@)
>>> # -------------------------------------------------- tips_contains
>>> s = Tips(); 0 in s                            #1:
TypeError: argument of type 'Tips' is not iterable
>>> s = Tips(); 0 in s                            #2:
False
>>> s = Tips(); 0 in s                            #3:
False
>>> s = Tips(); "0" in s
False
>>> s = Tips(); "A" in s
True
■ 事例:コードの解説
    class Tips(object): pass

メソッド __contains__ を定義せずに、演算子 in を利用すると、

>>> s = Tips(); 0 in s                            #1:
TypeError: argument of type 'Tips' is not iterable

例外 TypeError が生成され、エラーメッセージが出力されます。なぜなら、演算子 in の動作は、特殊メソッド __contains__ によって規定されるからです。

□ メソッド __contains__ を定義する
    class Tips(object):
        def __contains__(self, item):
            return 0

メソッド __contains__ を定義すると、

>>> s = Tips(); 0 in s                            #2:
False

演算子 in を利用したときに、リターン値として False が得られます。なぜなら、値 0 は False と見なされるからです。

□ メソッドのリターン値
    class Tips(object):
        def __contains__(self, item):
            return isinstance(item, str) and item.isalpha()

リターン値を再定義すると、

>>> s = Tips(); 0 in s                            #3:
False
>>> s = Tips(); "0" in s
False
>>> s = Tips(); "A" in s
True

英字だけからなる文字列のときだけ、リターン値として True が得られます。


 ↑ TOP

》作業中です《
update*13/02/17 1:19:41