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 :

Utilit� de super()


Sujet :

Python

  1. #1
    Membre �m�rite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par d�faut Utilit� de super()
    salut tous,

    J'ai commenc� y'a quelque heures � jeter un coup d'oeil quant � la mani�re de se servir de PyQt, ma question ne porte pas sur Qt, mais sur la signification de l'utilisation de super(), je ne comprend pas ... J'ai lu la doc de python.org sur cette fonction, mais... rien � faire, je crois capt� vaguement le but, mais le pourquoi du comment m'�chappe totalement...

    voici le bout de code en question :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    class Form(QDialog):
        def __init__(self, parent=None):
            super(Form, self).__init__(parent)
    ainsi que l'explication du suppos� cas de figure de l'utilisation de super():
    There are two typical use cases for �super�. In a class hierarchy with single inheritance, �super� can be used to refer to parent classes without naming them explicitly, thus making the code more maintainable. This use closely parallels the use of �super� in other programming languages.
    D'apr�s ce j'ai cru comprendre, dans ce cas ce serait utilis� dans cet exemple pour lancer la m�thode __init__ de la classe parente... mais plusieurs fois, j'ai vu une fa�on diff�rente de proc�der (dans des exmple pour Tkinter, mais peu importe, le fait est que dans mes souvenirs, �a m'avait l'air plus simple...)
    Voil�, si quelqu'un voulait bien m'expliquer le but et le fonctionnement de super(), ce serait sympa, merci

  2. #2
    Expert confirm�
    Avatar de Guigui_
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2002
    Messages
    1 864
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Sa�ne et Loire (Bourgogne)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 864
    Par d�faut
    la fonction super permet d'appeler une fonction de la classe m�re. Cela est utile si la classe enfant red�finit la m�me fonction (que celle de la classe m�re) mais qu'on veut tout de m�me utiliser celle de la classe m�re. Si la classe fille ne red�finit pas la fonction de la classe m�re, il n'y a pas besoin d'utiliser la fonction super.

    Un exemple ici:
    http://python.developpez.com/faq/?pa...utableHeritage

  3. #3
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2007
    Messages
    119
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 119
    Par d�faut
    En effet, super permet d'appeler une m�thode surcharg�e, mais pas n�cessairement celle de la classe m�re. Je m'explique.

    En fait, super(c,i) retourne un proxy de la classe qui suit c dans le mro de i. Le mro, c'est la liste ordonn�e de la hi�rarchie d'une classe. Tout ca ne marche qu'avec des classes "new style" (d�rivent toutes d'object)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A(object):
        def x(self): print 'a'
    class B(A):
        def x(self): print 'b'
    >>> B().x()
    b                             
    >>> super(B,B()).x()
    a
    Dans le cas d'un heritage simple, utiliser super ou la classe m�re ne fait pas de diff�rence. A la rigueur, c'est plus maintenable (et encore).

    Par contre, si on prend une hierarchie en diamant:

    A
    / \
    B C
    \ /
    D

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class C(A):
        def x(self):print 'c'
    class D(B,C):
        def x(self): print 'd'
     
    >>> import inspect
    >>> inspect.getmro(D)
    (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
    Et on a (oh surprise!):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    >>> super(B,D()).x()
    c
    Au lieu de a. L'interet est de n'appeler qu'une fois la m�thode de la classe A, et d'appeler les m�thodes dans le bon ordre.
    Le probl�me de super est d'une part le passage d'argument (il faut que tous les arguments soient compatibles) et d'autre part que super soit utilis� syst�matiquement dans toutes les classes.

  4. #4
    Membre �m�rite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par d�faut
    Ahhhh....Ok, merci � vous pour ces explications .

    Toutefois, j'ai encore une question, enfin plus une requ�te de confirmation pour voir si j'ai bien compris...

    Dans le cas d'une hi�rarchie en diamant juste un poil plus grosse que celle que tu m'as montr� Fructidor :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
      A
     /|\
    B C D
     \|/
      E
    #ou E hériterait dans l'ordre de (B,C,D), et D de (A)
    les connections en quelque sortes, lors de l'appel de la m�thode x via un super object, pourrait se sh�matiser de la sorte :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
        A
        |
    B-C-D
    |
    E
    #Dans le cas de test d'appel de la méthode x via super(y,E()).x() pour y in (E,B,C,D)
    C'est bien �a ?

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2007
    Messages
    119
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 119
    Par d�faut
    Oui, c'est � dire que si toutes les classes poss�daient une m�thode qui appellerait super(self,...) ou ... serait remplac� par la classe, alors les m�thodes seraient appel�es dans cet ordre.

    Voici un exemple pour __init__ avec une fa�on de g�rer le probl�me des arguments:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    class A(object):
        def __init__(self,*args,**kwargs):
            toto=kwargs.pop('toto')
            print 'a',toto
            super(A,self).__init__(*args,**kwargs)
     
     
    class B(A):
        def __init__(self,*args,**kwargs):
            print 'b'
            super(B,self).__init__(*args,**kwargs)
     
    class C(A):
        def __init__(self,*args,**kwargs):
            print 'c'
            super(C,self).__init__(*args,**kwargs)
     
    class D(A):
        def __init__(self,*args,**kwargs):
            print 'd'
            super(D,self).__init__(*args,**kwargs)
     
    class E(B,C,D):
        def __init__(self,*args,**kwargs):
            print 'e'
            super(E,self).__init__(*args,**kwargs)
     
    >>> e=E(toto='un argument')
    e
    b
    c
    d
    a un argument

  6. #6
    Membre �m�rite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par d�faut
    Int�ressant comme fonction... merci

  7. #7
    Membre � l'essai
    Homme Profil pro
    D�veloppeur multim�dia
    Inscrit en
    Mars 2018
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur multim�dia

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par d�faut
    Explications en fran�ais sur le fonctionnement interne de super (), qui ne se limite pas simplement � r�soudre le probl�me de la r�solution de l'appel � une m�thode surcharg�e dans une configuration en diamant :

    http://www.stashofcode.fr/comment-ma...per-de-python/

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 10
    Dernier message: 20/03/2010, 19h54
  2. Utilit� de super.paintComponent(comp)
    Par Invit� dans le forum AWT/Swing
    R�ponses: 5
    Dernier message: 06/06/2007, 14h44
  3. [LG]Utilité du type enuméré ?
    Par tarbala dans le forum Langage
    R�ponses: 2
    Dernier message: 10/12/2003, 16h20
  4. Le BIOS et son utilit�
    Par le mage tophinus dans le forum Assembleur
    R�ponses: 75
    Dernier message: 21/11/2003, 15h37
  5. utilit� du binaire et hexadecimaux?
    Par souris78 dans le forum C
    R�ponses: 9
    Dernier message: 01/07/2003, 15h08

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