2010-02-07 11 views
131

Wenn ich meine eigene Klasse in Python erstelle, welche Funktion sollte ich definieren, um die Verwendung des "in" -Operators, z.Pythons "in" -Operator überschreiben?

class MyClass(object): 
    ... 

m = MyClass() 

if 54 in m: 
    ... 
+0

ich gesucht wurde tatsächlich, wie die 'is' außer Kraft zu setzen und 'ist nicht 'Betreiber. Wie eine 'query = tinydb.Query(). Field == value', um auch' Query() schreiben zu können. Field is not None'. Aber es scheint, dass ich vorerst noch '__eq__' und' __ne__' habe, was zum unpythonischen 'Query(). Field! = None' führt. (sarc) –

Antwort

134

Eine vollständigere Antwort ist:

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 erhalten, wenn gefragt, ob 54 in m war:

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

documentation on overloading __contains__ See.

+0

@Pthulin, Ihre können in Bezug auf den Code "vollständiger" sein, aber Ignacios Links zu der Dokumentation, die immer ein großes Plus für einige ist. –

+12

@PEter. Yeah, aber einige von uns bevorzugen eine schöne, visuelle Darstellung der Antwort. Ignacio hat wenig dazu beigetragen, die Frage zu beantworten, als uns zuerst hier zu führen, anstatt Google, nein, danke. –

+0

Zoran, stimme ich zu, und ich habe sogar diese Antwort und nicht die andere aufgestuft. Ich weise nur darauf hin, dass eine wirklich gute Antwort immer auf Dokumente verweisen sollte, falls verfügbar. –

6

Vielleicht haben Sie auch einen Blick auf eine Infixoperator Überschreibung Rahmen nehmen möchte ich in der Lage war, zu verwenden, um eine domänenspezifische Sprache zu erstellen:

http://code.activestate.com/recipes/384122/

+0

Ordentlicher Trick. Ich kann mir keinen Anwendungsfall vorstellen, aber sehr ordentlich. –