Pythons 'in'-Operator überschreiben?

197

Wenn ich meine eigene Klasse in Python erstelle, welche Funktion sollte ich definieren, um die Verwendung des Operators 'in' zu ermöglichen, z

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...
Astrofrog
quelle
Ich habe tatsächlich gesucht, wie man die Operatoren isund überschreibt is not. Wie ein query = tinydb.Query().field == value, um auch schreiben zu können Query().field is not None. Aber es scheint, ich bin mit __eq__und __ne__vorerst verlassen, was zur Unpythonie führt Query().field != None. (sarc)
Tomasz Gandor

Antworten:

191

Eine vollständigere Antwort lautet:

class MyClass(object):

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

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

Hier würden Sie wahr werden, wenn Sie fragen, ob 54 in m ist:

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

Siehe Dokumentation zur Überladung__contains__ .

Pthulin
quelle
@pthulin, Ihr Code mag in Bezug auf den Code "vollständiger" sein, aber Ignacios Links zur Dokumentation sind für einige immer ein großes Plus.
Peter Hansen
16
@Peter. Ja, aber einige von uns bevorzugen eine schöne visuelle Darstellung der Antwort. Ignacio hat wenig getan, um die Frage zu unterstützen, außer uns zuerst hierher zu leiten, anstatt zu googeln. Nein, danke.
Zoran Pavlovic
Zoran, ich stimme zu, und ich habe diese Antwort sogar positiv bewertet und nicht die andere. Ich möchte nur darauf hinweisen, dass eine wirklich gute Antwort immer auf Dokumente verweisen sollte, falls verfügbar.
Peter Hansen
13
Alle Links sterben und deshalb ist Ignacios Antwort auf SO wackelig. Links + Beispiel ist das Beste und deshalb ist eine Kombination der beiden Antworten, über die wir sprechen, am besten.
Demongolem
1
@demongolem Die offizielle Python-Dokumentation stirbt mit oder nachdem der Interpreter nicht mehr heruntergeladen werden kann. Und es ist keine reine Linkantwort. Ich bin auf diese Seite gekommen, um nach der Antwort zu suchen, und habe sie gefunden, ohne auf weitere Links zu klicken (dh der Prototyp war ausreichend). Ich stimme im Prinzip zu, aber imho, das gilt hier nicht.
wizzwizz4