2010-02-07 9 views
131

Si je crée ma propre classe en Python, quelle fonction dois-je définir pour permettre l'utilisation de l'opérateur 'in', par ex.Remplacer l'opérateur 'in' de Python?

class MyClass(object): 
    ... 

m = MyClass() 

if 54 in m: 
    ... 
+0

je fait chercher comment remplacer le 'is' et "n'est pas" les opérateurs. Comme un 'query = tinydb.Query(). Field == value', pour pouvoir aussi écrire' Query(). Field n'est pas None'. Mais il semble que je sois à gauche avec '__eq__' et' __ne__' pour l'instant, ce qui conduit à l'non-pythonique 'Query(). Field! = None'. (sarc) –

Répondre

134

une réponse plus complète est:

class MyClass(object): 

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

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

Ici, vous obtenez vrai lorsque vous demandez si 54 était en m:

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

Voir documentation on overloading __contains__.

+0

@pthulin, le vôtre peut être "plus complet" en termes de code, mais les liens d'Ignacio à la documentation, ce qui est toujours un gros plus pour certains. –

+12

@PEter. YEah, mais certains d'entre nous préfèrent une belle représentation visuelle de la réponse. Ignacio a fait peu de bénéfice pour la question autre que nous diriger ici d'abord au lieu de google, non merci. –

+0

Zoran, je suis d'accord, et j'ai même upvoted cette réponse et pas l'autre. Je signale simplement qu'une bonne réponse devrait toujours être liée aux documents, si disponibles. –

6

Vous pouvez également jeter un oeil à un cadre opérateur infixe override j'ai pu utiliser pour créer un langage spécifique à un domaine:

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

+0

Astuce soignée. Je ne peux pas penser à un usecase pour cela, mais très soigné. –

Questions connexes