Python Language Recherche dans des classes personnalisées: __contains__ et __iter__


Exemple

Pour autoriser l'utilisation de in pour les classes personnalisées, la classe doit fournir la méthode magique __contains__ ou, à défaut, une __iter__ __iter__.

Supposons que vous ayez une classe contenant une list de list s:

class ListList:
    def __init__(self, value):
        self.value = value
        # Create a set of all values for fast access
        self.setofvalues = set(item for sublist in self.value for item in sublist)
        
    def __iter__(self):
        print('Using __iter__.')
        # A generator over all sublist elements
        return (item for sublist in self.value for item in sublist)
        
    def __contains__(self, value):
        print('Using __contains__.')
        # Just lookup if the value is in the set
        return value in self.setofvalues

        # Even without the set you could use the iter method for the contains-check:
        # return any(item == value for item in iter(self))

L'utilisation du test d'appartenance est possible en utilisant in :

a = ListList([[1,1,1],[0,1,1],[1,5,1]])
10 in a    # False
# Prints: Using __contains__.
5 in a     # True
# Prints: Using __contains__.

même après la suppression de la méthode __contains__ :

del ListList.__contains__
5 in a     # True
# Prints: Using __iter__.

Remarque: La boucle in (comme for i in a ) utilisera toujours __iter__ même si la classe implémente une __contains__ méthode.