4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Python中級者への道】独自クラスにinを定義する

Posted at

まとめへのリンク

はじめに

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を含んでいるか?を返してあげればよいです。

最後に

あまり嬉しさがないメソッドのような気がしますが、大規模なコードを書くときは役に立つかもしれません。
ちょっと自分はまだあまり具体的な嬉しいポイントがわかってないです・・・

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?