まとめへのリンク
はじめに
Pythonの勉強をするために、acopyという群知能ライブラリを写経していました。
acopyでは、多くのPythonの面白い文法・イディオムが使われており、その中でも便利だなぁというのをまとめています。
今回は、クラスのインスタンスにinを利用できるようにします。
__contains__
クラスには、__contains__
という特殊メソッドを定義することができます。
__contains__
メソッドを定義すると、ある値item
がクラスに含まれるか?というのを簡潔にin
演算子で表現することができます。
具体例
まずは、__contains__
がないバージョンを見てみます。
class A:
def __init__(self, x):
self.arr = list(range(x))
'''
Yes
No
'''
a = A(10)
print(("No", "Yes")[3 in a.arr])
print(("No", "Yes")[23 in a.arr])
今回適当に、クラスAを定義し初期化で受け取った$x$を利用して
[0, x)
のリストを作成しています。
ここで、$3,23$がそれぞれインスタンスaに含まれているか?を調べるために、[3 in a.arr]
というコードを書いています。
これによって、インスタンスaのarrという配列に、3が含まれますか?というのを調べることができます。
しかし、もしクラスでこのような包含関係を調べるのがarrのみ! といった一個しか無いなら__contains__
を定義すればより直感的に表記できます。
class A:
def __init__(self, x):
self.arr = list(range(x))
def __contains__(self, item):
return item in self.arr
'''
Yes
No
'''
a = A(10)
print(("No", "Yes")[3 in a])
print(("No", "Yes")[23 in a])
先程のソースコードと異なり、__contains__
メソッドを定義しました。
このメソッドでは、item in インスタンス
で与えられるitem
を引数とし、このitemを含んでいるか?を返してあげればよいです。
最後に
あまり嬉しさがないメソッドのような気がしますが、大規模なコードを書くときは役に立つかもしれません。
ちょっと自分はまだあまり具体的な嬉しいポイントがわかってないです・・・