実用的な事例


class eXdict:
def get(self, key):
return self._toget(key, "get")

抽象クラス eXdict では、テンプレートメソッド get の本体で、共通する補助関数 _toget を利用しています。ここでは、get に固有の処理を依頼するために、その識別子として "get" を指定します。


Previous|5/10|Next

特殊メソッド __getitem__

演算子 [] の動作を規定するのが、特殊メソッド __getitem__ です。それは、次のようにして確認できます。


>>> class Reverse: pass

>>> dir(Reverse)
['__doc__', '__module__']

新たに定義したクラス Reverse には、まだメソッドを定義していません。そのため、


>>> Reverse()[0]

Traceback (most recent call last):
File "", line 1, in
Reverse()[0]
AttributeError: Reverse instance has no attribute '__getitem__'

新たに生成した Reverse インスタンスに、演算子 を適用すると、例外 AttributeError を生成して、エラーメッセージを出力します。これを見ると、演算子 に呼応する __getitem__ が必要になることが分かります。
そこで、演算子 [] を任意のインスタンスに適用できるように、__getitem__ を再定義します。

組み込み型の操作


>>> help(dict.__getitem__) # 特殊メソッド
Help on method_descriptor:

__getitem__(...)
x.__getitem__(y) <==> x[y]

任意のインスタンス s に対して、式 s[key] を評価するときに、このメソッドを呼び出します。つまり、式 s. __getitem__(key) と等価です。dict に対しては、key が見つからないと、例外 KeyError を生成します。

実用的な事例

組み込み型 dict の中から任意のキーに対応する値を獲得するのに、演算子 [] を利用できます。クラス eXdict の傘下でも、これに準拠します。


class eXdict:
def __getitem__(self, key):
return self._toget(key, "getitem")

抽象クラス eXdict では、テンプレートメソッド __getitem__ の本体で、共通する補助関数 _toget を利用しています。ここでは、getitem に固有の処理を依頼するために、その識別子として "getitem" を指定します。

便宜的な事例

クラス Reverse は(説明用の便宜的なもので)与えられた文字列の順序を入れ換え(反転し)て、新たな文字列を生成するだけのものです。


class Reverse:
def __init__(self, s):
self.s = s[::-1]
def __getitem__(self, key):
return self.s[key]

メソッド __getitem__ は、演算子 を利用して、インスタンス属性 self.s が保持する部分文字列をリターン値とします。ここで興味深いのは、演算子 の動作を規定するメソッド __getitem__ を実現するときに、その を利用していることです。つまり、演算子 を Reverse インスタンスに適用すると、それは演算子 [] を文字列 self.s に適用することに帰着します。


>>> s = Reverse("ABC")
>>> for i,e in enumerate(s): print i,s[i]
0 C
1 B
2 A

反転した文字列 s を生成して、その添字式 s[i] を評価した結果を出力すると、各文字が順に得られます。