Partage
  • Partager sur Facebook
  • Partager sur Twitter

super

    12 février 2016 à 14:46:46

    bonjour

    Dans ce code trouvé sur cette page: https://zestedesavoir.com/tutoriels/954/notions-de-python-avancees/7-accessors-descriptors/#1-1-accessors

    class Temperature:
    
        def __init__(self):
            
            self._value = 0
    
    
        def __setattr__(self, name, value):
            
            if name == 'Celcius':
                self._value = value
    
            elif name == 'Farenheit':
                self._value = value * 1.8 + 32
    
            elif name == 'Kelvin':
                self._value = value - 273.15
    
            else:
    ##          object.__setattr__(self, name, value)
                super().__setattr__(name, value)

    Je m'étonne qu'on ne passe pas le self en argument de __setattr__ sur la dernière ligne (j'ai essayé avec et ça plante). Je pensais que super() renvoyait la première classe parente contenant la méthode __setattr__ ici object mais ce n'est pas ça. Finalement la syntaxe python 2 était plus claire car au moins il y a le self qui passe en argument. super(Temperature, self).__setattr__(name, value)

    Si j'appelle directement la méthode __setattr__ de la classe object comme sur la ligne commentée, alors là bien sur il faut le self.

    -
    Edité par ast2 12 février 2016 à 14:48:58

    • Partager sur Facebook
    • Partager sur Twitter
      12 février 2016 à 15:13:30

      Salut,

      Tu peux trouver pas mal de ressources sur le net avec les explications du super() en Python 3.

      Voici un lien intéressant par exemple : http://stackoverflow.com/questions/19608134/why-is-python-3-xs-super-magic

      Certains préfèrent cette notation simplifiée, et d'autres trouvent ça moins parlant. Maintenant, à toi de voir si les explications de cette nouvelle notation arrivent à te convaincre ;)

      -
      Edité par KriSpiX 12 février 2016 à 15:17:54

      • Partager sur Facebook
      • Partager sur Twitter
        12 février 2016 à 15:15:46

        Il me semble que c'est la nouvelle forme pour l'utilisation de super. Mais je crois qu'une version alternative existe (en tout cas c'est ce que j'ai mis dans mes notes :p):

        super(ClasseFille, self).__init__(attribut_parent)
        • Partager sur Facebook
        • Partager sur Twitter
        Précepte: Le mieux est l'ennemi du bien
          12 février 2016 à 19:06:40

          La réponse de trouve dans l'aide de super, voici le première ligne retournée par help(super) :

          super() -> same as super(__class__, <first argument>)

          Ainsi, quand tu utilises super() depuis une méthode, __class__ (qui référence la classe courante) et le premier paramètre de la méthode (donc self) sont automatiquement ajoutés à l'appel.

          -
          Edité par entwanne 12 février 2016 à 19:09:23

          • Partager sur Facebook
          • Partager sur Twitter
            14 février 2016 à 3:21:12

            # ancien
            class Maclasse(object):
             
                def __init__(self):
                    super(Maclasse, self).__init__()
            
            
            
            # nouveau
            class Maclasse:
             
                def __init__(self):
                    super().__init__()
            • Partager sur Facebook
            • Partager sur Twitter

            super

            × 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