Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonctionnement de __getitem__ et __setitem__

gros doute de ma pars :)

    24 mars 2019 à 13:32:41

    Bonjour à tous :)  voila je débute en python et je me pose un question.

    je suis rendus à ce niveau du cours  :

    https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/233046-appliquez-des-methodes-speciales

    et je me demandais si on peut modifier une valeur avec __setitem__ ou afficher un message dans _getitem__ tels que:

    class ZDict:
        """ classe enveloppe de dictionnaire """
        def __init__(self):
            self._dictionnaire = {}
            
        def __getitem__(self, index):
            """ méthode quand on souhaite accéder aux index de l'exterieur """
            return self._dictionnaire[index]
            print("test")
        def __setitem__(self, index, valeur):
            """ méthode de classe appeller quand on souhaite utiliser objet[index] """
            self._dictionnaire[index] = valeur * 2
            
            
            

    car quand je fais 

    test = ZDict()
    
    test._dictionnaire["a"] = 2
    test._dictionnaire["a"]

    le resultat est:

    Out[10]: 2

    donc j'ai l'impression que print("test") ou valeur*2 n'as pas été prix en compte, est normale ou une erreur de ma part que je n'aurais pas vu ?

    merci à vous, en vous souhaitant une bonne journée




    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2019 à 13:42:36

      Bonjour,

      L'intérêt de l'exercice reposerait sur, "réussir les lignes de codes suivantes":

      test = ZDict()
      
      test["a"] = 2 # __setitem__
      
      print(test["a"]) # __getitem__

      et donc je ne comprend pas la présence de l'attribut self._dictionnaire.

      Soit tu te sers des méthodes de l'objet dictionnaire dict et dans ce cas, on hérite de cet objet

      class ZDict(dict):
          # suite

      soit on crée son propre dictionnaire si les fonctionnalités sont trop différentes de l'objet dict standard.

      À toi de voir quels sont tes besoins, mais ils sont à définir très précisément avant de coder.


      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        24 mars 2019 à 14:25:09

        Ha ok, c'est beaucoup plus logique comme ça effectivement :p, d'où la phrase "En réalité, notre classe fera semblant d'être un dictionnaire, elle réagira de la même manière, mais elle n'en sera pas réellement un." merci beaucoup pour l'aides et désoler de l'erreur qui doit choquer les connaisseurs lol,  bonne journée.
        • Partager sur Facebook
        • Partager sur Twitter
          24 mars 2019 à 14:31:10

          Les dictionnaires partent sur le principe des tables de hachage, c'est donc l'association clés / valeurs.

          Ça se représente bien en python

          class ZDict:
              def __init__(self, ...):
                  self.keys = []
                  self.values = []

          Les listes permettent d'ajouter n'importe quels élément de n'importe quel types.

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            24 mars 2019 à 21:00:42

            Avec des listes tu obtiendrais en fait une sorte de dictionnaire ordonné.

            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2019 à 14:52:26

              ok c'est une façon de créer un dico dans une classe, j'ai bien compris je crois merci à vous
              • Partager sur Facebook
              • Partager sur Twitter

              fonctionnement de __getitem__ et __setitem__

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown