IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème super class et **kwargs [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Par défaut Problème super class et **kwargs
    Bonjour, j'ai donc un problème de passage d'arguments **kwargs d'une classe à une seconde. Pour mieux expliciter, voici un dummy code avec l'erreur que j'obtiens.

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Parent:
     
        def __init__(self, age, **kwargs):
            self.age = age
            if 'kwargs1' and 'kwargs2' in kwargs:
                self.kwargs1 = kwargs['kwargs1']
                self.kwargs2 = kwargs['kwargs2']
     
    class Child(Parent):
     
        def __init__(self, **kwargs):
            super(Child, self).__init__(**kwargs)
     
    age = 10
     
    My_child = Child(age, kwargs1='John', kwargs2='Robert')
    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-76-91ce7bcdbcc5> in <module>()
         14 age = 10
         15 
    ---> 16 My_child = Child(age, kwargs1='John', kwargs2='Robert')
     
    TypeError: __init__() takes 1 positional argument but 2 were given
    J'ai fais quelques recherches mais j'avoue ne pas comprendre l'origine du problème.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Il faut interpréter correctement le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: __init__() takes 1 positional argument but 2 were given
    Dans la déclaration, il n'y en a qu'un "self", dans l'appel, il y aura aussi "age"... Ce qui fait bien 2.
    Avec "My_child = Child(age=age, kwargs1='John', kwargs2='Robert')", çà devrait marcher.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Par défaut
    Merci, cela fonctionne et je crois que j'ai compris. En fait, il faut redonner les argument de la classe Parent dans la classe Child :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Parent:
     
        def __init__(self, age, **kwargs):
            self.age = age
            if 'kwargs1' and 'kwargs2' in kwargs:
                self.kwargs1 = kwargs['kwargs1']
                self.kwargs2 = kwargs['kwargs2']
     
    class Child(Parent):
     
        def __init__(self, age, **kwargs):
            super(Child, self).__init__(age, **kwargs)
     
    age = 10
     
    My_child = Child(age, kwargs1='John', kwargs2='Robert')
    Là je n'ai plus d'erreur. Pourtant, je pensais que lorsque l'on utilisait les super classes, c'était aussi pour ne pas avoir à redonner les arguments de la classe supérieure. En fait, Comme la classe Child est une sous classe de la classe Parent, je pensais que dans son self, elle incluait les arguments de la classe Parent.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Citation Envoyé par elglantosimpatico Voir le message
    Pourtant, je pensais que lorsque l'on utilisait les super classes, c'était aussi pour ne pas avoir à redonner les arguments de la classe supérieure. En fait, Comme la classe Child est une sous classe de la classe Parent, je pensais que dans son self, elle incluait les arguments de la classe Parent.
    Ben une super classe n'a pas de super pouvoir et une méthode reste une fonction. Être associé à un objet, ne change pas grand chose à sa nature de "fonction" et à la façon dont elle traite les paramètres. Essayez avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def g(a, **kwds):
        print (a, kwds)
    def f(**kwds):
        g(**kwds)
    Vous aurez le même comportement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Par défaut
    Merci. Du coup, j'en profite pour poser deux autres questions sans ouvrir de nouveau sujet. J'ai vu plusieurs exemples d'utilisation de super().__init__(). Si je reprend mon exemple, cela donne :

    Options 1 (celle utilisée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Child(Parent):
     
        def __init__(self, age, **kwargs):
            super(Child, self).__init__(age, **kwargs)
    Option 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Child(Parent):
     
        def __init__(self, age, **kwargs):
            super().__init__(age, **kwargs)
    Au final, dans le résultat, il ne me semble pas y avoir de différence. Pourtant, je suppose que si j'ai vu les deux méthodes c'est qu'il doit bien y avoir une subtilité que je ne saisis pas.

    Dans le même ordre d'idée, je vois aussi souvent les classe initiales définie comme :

    De même, je ne vois pas la différence entre écrire "object" encore les parenthèses ou ne rien mettre.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Citation Envoyé par elglantosimpatico Voir le message
    Au final, dans le résultat, il ne me semble pas y avoir de différence. Pourtant, je suppose que si j'ai vu les deux méthodes c'est qu'il doit bien y avoir une subtilité que je ne saisis pas.
    super(Child, self) et class Parent(object) sont des syntaxes Python2 qui fonctionnent toujours avec Python3 et qui peuvent être utiles si vous écrivez du code "compatible" avec ces deux versions.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Par défaut
    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de classe
    Par DeusXL dans le forum DirectX
    Réponses: 15
    Dernier message: 04/12/2005, 14h37
  2. Réponses: 8
    Dernier message: 18/07/2005, 18h38
  3. [FLASH MX2004] Problème de classe
    Par JulPoWeR dans le forum Flash
    Réponses: 1
    Dernier message: 10/07/2005, 22h51
  4. Referencer une super classe
    Par MrBlonde666 dans le forum Général Python
    Réponses: 2
    Dernier message: 02/07/2005, 17h52
  5. Super classes et sous-classes/Méthodes
    Par smag dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 23h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo