Pythonの「in」演算子をオーバーライドしますか?


197

Pythonで独自のクラスを作成している場合、「in」演算子の使用を許可するためにどの関数を定義する必要がありますか。

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

実際にisand is not演算子をオーバーライドする方法を探していました。のようにquery = tinydb.Query().field == value、また書くことができるようにQuery().field is not None。しかし、私が残されてるようだ__eq____ne__unpythonicに、当面そのリードをQuery().field != None。(sarc)
Tomasz

回答:



191

より完全な答えは:

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

ここでは、54がmであるかどうかを尋ねるとTrueになります。

>>> m = MyClass()
>>> 54 in m
True  

オーバーロードに関するドキュメントを__contains__ご覧ください。


@pthulin、あなたのコードは「より完全」かもしれませんが、Ignacioのドキュメントへのリンクは、常にいくつかにとって大きなプラスです。
Peter Hansen、

16
@PEter。ええ、でも私たちの中には、答えの視覚的表現を好む人もいます。イグナシオはグーグルの代わりに最初に私たちをここに導く以外、質問に利益をもたらすことはほとんどありませんでした、ありがとう。
Zoran Pavlovic

Zoran、私は同意します、そして私はこの答えに反対票を投じさえしました。本当に良い答えは、可能であれば常にドキュメントにリンクする必要があることを指摘しています。
Peter Hansen、

13
すべて、リンクが死ぬので、イグナシオの答えがSOで不安定です。リンク+例が最適です。そのため、私たちが話している2つの答えの組み合わせが最適です。
デーモンゴーレム

1
@demongolem公式のPythonドキュメントは、インタプリタがダウンロードできなくなるか、ダウンロードできなくなると終了します。そして、それはリンクのみの答えではありません。私は答えを探してこのページに来て、それ以上のリンクをクリックせずにそれを見つけました(つまり、プロトタイプで十分でした)。原則的には同意しますが、ここでは当てはまりません。
wizzwizz4

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.