Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ERREUR ?] TUTO python - métaclasse

    31 octobre 2013 à 11:59:58

    Bonjour à tous,

    Je commence à me mettre au langage python via le tutoriel de ce site (qui est excélent ! =) ) et j'en arrive aux métaclasses. Dans la première section, il est expliqué ce qui se passe durant le processus d'instantation et la définition de la méthode__new__.

    Dans l'exemple nous redéfinissons la classe Personne vià le code suivant :

    class Personne:
         
        """Classe définissant une personne.
         
        Elle possède comme attributs :
        nom -- le nom de la personne
        prenom -- son prénom
        age -- son âge
        lieu_residence -- son lieu de résidence
         
        Le nom et le prénom doivent être passés au constructeur."""
         
        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):
            """Constructeur de notre personne."""
            print("Appel de la méthode __init__")
            self.nom = nom
            self.prenom = prenom
            self.age = 23
            self.lieu_residence = "Lyon"


    Cependant, lors de mes tests j'ai eu une erreur :

    >>> personne = Personne("Doe", "John")
    Appel de la méthode __new__ de la classe <class '__main__.Personne'>
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 16, in __new__
    TypeError: object() takes no parameters

    J'en ai conclu que la méthode 'new' devais probablement n'attendre que le paramettre de classe lorsque qu'on l'appelait depuis la classe object. J'ai donc utilisé le code suivant :

    class Personne:
        """Classe définissant une personne.
          
        Elle possède comme attributs :
        nom -- le nom de la personne
        prenom -- son prénom
        age -- son âge
        lieu_residence -- son lieu de résidence
         
        Le nom et le prénom doivent être passés au constructeur."""
         
        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)     
        
        def __init__(self, nom, prenom):
            """Constructeur de notre personne."""
            print("Appel de la méthode __init__")
            self.nom = nom
            self.prenom = prenom
            self.age = 23
            self.lieu_residence = "Lyon"

     Et là magie !

    >>> personne = Personne("Doe","John")
    Appel de la méthode __new__ de la classe <class '__main__.Personne'>
    Appel de la méthode __init__
    

    Je me demande alors s'il s'agit bien d'une coquille dans le tuto ou si j'ai juste fais une erreur et eu un coup de bol en voulant tester quelquechose ...

    J'espère que j'aurais été assez clair et que quelqu'un acceptera de m'aider =)

    Bonne journée.



    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2015 à 23:15:24

      salut,

      le sujet est un peu ancien mais j'ai relevé la même anomalie que toi et effectivement je suis également obligé de passer par :

      return object.__new__(cls)

      et non

      return object.__new__(cls,parm1,parm2...)

      Donc erreur ou pas, mystère ?

      • Partager sur Facebook
      • Partager sur Twitter
        2 mars 2018 à 14:57:15

        Petite information complémentaire

        le code suivant fonctionne sous les version antérieur à python 3.3:

        return object.__new__(cls, nom, prenom)

        Pour une version plus récente comme python 3.6, il faut utiliser :

        return object.__new__(cls)  



        -
        Edité par Cyth 2 mars 2018 à 15:01:24

        • Partager sur Facebook
        • Partager sur Twitter

        [ERREUR ?] TUTO python - métaclasse

        × 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