Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur dans le cours sur Python ?

    6 août 2015 à 23:11:06

    Bonjour,

    Je crois avoir trouvé une erreur dans le cours sur Python (3.4), dans le chapitre sur les métaclasses.

    Il s'agit du deuxième bloc de code (j'ai supprimé les commentaires) :

    class Personne:
        
        def __new__(cls, nom, prenom):
            print("Appel de la méthode __new__ de la classe {}".format(cls))
            # On laisse le travail à object
            return object.__new__(cls, nom, prenom)
        
        def __init__(self, nom, prenom):
            print("Appel de la méthode __init__")
            self.nom = nom
            self.prenom = prenom
            self.age = 23
            self.lieu_residence = "Lyon"
    
    personne = Personne("Doe", "John")

    Ce code ne fonctionne pas (en tout cas, sur Python 3.4) et renvoie une erreur du type "TypeError: object() takes no parameters" ce qui est normal. En effet, en faisant "object.__new__(cls, nom, prenom)", on envoie les paramètres après cls (la classe dont une instance a été demandée) au constructeur de object qui ne prend aucun paramètre.

    Pour corriger le problème, il faudrait supprimer les deux arguments "nom, prenom" envoyés à la méthode __new__ de object.

    Les deux paramètres nom et prénom sur la méthode __new__ de la classe Personne seront envoyés directement au constructeur de la classe et pourront être utilisés (ce qu'il nous faut) ...

    Documentation de object.__new__() : https://docs.python.org/3/reference/datamodel.html#object.__new__

    Cordialement, Formatink

    -
    Edité par Formatink 7 août 2015 à 12:04:03

    • Partager sur Facebook
    • Partager sur Twitter
      6 août 2015 à 23:57:24

      Hello,

      Depuis http://bugs.python.org/issue1683368 ... ce n'est plus possible : en effet, il faut que l'appel à object.__new__ soit effectué sans arguments autres que la classe à instancier.

      Ainsi, remplacer object.new(cls, nom, prenom) par object.__new__(cls) suffit pour corriger ça :)

      Bémol (à mon goût) : on ne peut plus utiliser super(Prenom, cls) comme avant(=Py2.7) :(

      • Partager sur Facebook
      • Partager sur Twitter
        21 octobre 2018 à 22:13:52

        Hello

        Merci pour l'info.

        Dommage que l'info ait été remontée depuis 3 ans et le cours pas mis à jour ...

        • Partager sur Facebook
        • Partager sur Twitter
          7 février 2019 à 19:04:31

          Bonjour,

          Merci pour la correction.

          • Partager sur Facebook
          • Partager sur Twitter

          Erreur dans le cours sur Python ?

          × 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