Python >> Tutoriel Python >  >> Python

Méthode magique Python __getitem__()

La méthode magique de Python __getitem__(self, key) pour évaluer l'expression self[key] . Donc, si vous appelez my_obj[key] , Python appellera my_obj.__getitem__(key) .

Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.

Syntaxe et exemple minimal

object.__getitem__(self, key)

Examinons un exemple où vous remplacez le __getitem__ méthode magique d'une classe personnalisée HelloWorld.

class HelloWorld:
    def __getitem__(self, key):
        print('hello world', key)

hi = HelloWorld()

hi[42]
# hello world 42

hi['wide web']
# hello world wide web

Ce code montre plusieurs choses intéressantes :

  • Vous utilisez obj[key] appeler le obj.__getitem__(key) .
  • Vous pouvez lui transmettre des clés arbitraires.
  • Vous n'avez même pas besoin de renvoyer quoi que ce soit depuis __getitem__ (même si c'est bien sûr déconseillé). Dans ce cas, None est renvoyé.

Cependant, ceci n'est qu'un exemple factice, regardons un exemple complet implémentant toutes les méthodes __getitem__ , __setitem__ , et __delitem__ qui, ensemble, jouent magnifiquement ensemble pour implémenter un type de données personnalisé de type collection.

Exemple complet

Dans l'exemple suivant, vous créez un type de type liste personnalisé qui remplace le __getitem__ , __setitem__ , et __delitem__ méthodes.

class MyList:
    def __init__(self, lst):
        self.lst = lst

    def __getitem__(self, key):
        print('__getitem__', key)
        return self.lst[key]

    def __setitem__(self, key, value):
        print('__setitem__', key, value)
        self.lst[key] = value

    def __delitem__(self, key):
        print('__delitem__', key)
        del self.lst[key]

Chaque fois que vous ajoutez un nouvel élément, obtenez un élément ou supprimez un élément de votre liste personnalisée, il imprime les informations respectives afin que vous puissiez voir ce qui se passe.

Maintenant, utilisons ceci pour créer un wrapper de liste simple et imprimons le deuxième élément avec l'index 1 (indexation basée sur zéro).

my = MyList(['alice', 'bob', 'carl'])

print(my[1])
# __getitem__ 1
# bob

Notez comment Python appelle d'abord l'instruction print dans le __getitem__ sortie et clé 1 puis renvoie l'élément my[1] lui-même, le met dans le print(...) instruction qui aboutit à la sortie bob .

Ensuite, vous écrasez la valeur du deuxième élément de la liste avec l'index 1 :

my[1] = '42'
print(my[1])
# __setitem__ 1 42
# __getitem__ 1
# 42

Vous pouvez voir sur la sortie d'impression __setitem__ 1 42 ce __setitem__ a été appelé avec la clé 1 et la valeur 42 .

Ensuite, vous supprimez un élément avec l'expression del my[1] :

del my[1]
print(my[1])
# carl

Références :

  • https://docs.python.org/3/reference/datamodel.html