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 :

Héritage, super, __init__


Sujet :

Python

  1. #1
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut Héritage, super, __init__
    Bonsoir, j'aimerai bien, si cela est possible, avoir des informations détaillés sur les méthodes suivantes (Héritage B, C, D):
    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
    class A:
        def __init__(self, value="default"):
            self.a= "toto"
            self.b= "world"
            print("new objet A", value)
     
     
    class B(A):
        def __init__(self, value="child-B"):
            super(B,self).__init__(value)
            print("new objet B", value)
     
     
    class C(A):
        def __init__(self, value="child-C"):
            A.__init__(self, value)
            print("new objet C", value)
     
    class D(A):
        def __init__(self,value="child-D"):
            super().__init__(value)
            print("new objet D", value)
     
     
    a = A()
    b = B()
    c = C()
    d = D()
    Y-a t'il des différences? ...
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    • super().__init__(value), python V3
    • super(B,self).__init__(value) est Python V2.4+
    • A.__init__(self, value): construction pre v2.4+.

    Tant que la classe n'hérite pas de plusieurs classes, la fonction réalisée est identique. Sinon, seul "super" sait parcourir l'arbre d'héritage pour appeler les différentes méthodes __init__ "héritées".
    Pour les détails voir l'article
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Visiblement il s'agit de Python 3 (ce code est invalide en Python 2).

    Les classes B et D sont équivalentes. En fait, l'utilisation de super sans argument est une nouveauté de Python 3, la sémantique est la même que dans la classe B.

    La classe C est différente, mais la différence n’apparaît que si on utilise l'héritage multiple.

    Si on rajoute ceci à ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class CD(C,D): pass
    class DC(D,C): pass
     
    cd = CD()
    dc = DC()
    On obtient ce résultat supplémentaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    new objet A child-C
    new objet C child-C
    new objet A child-D
    new objet C child-D
    new objet D child-D
    Dans le premier cas, le C.__init__ est appelé en premier, et celui-ci appelle A.__init__. D.__init__ n'est pas appelé du tout.

    Dans le second cas, D.__init__ est appelé en premier, mais cette fois super() renvoie un proxy sur les méthodes de C, au lieu de A, c'est donc C.__init__ qui est appelé ensuite (qui lui appelle finalement A.__init__).

    La seconde sémantique est généralement jugée préférable, du point de vue des concepts OO, donc, s'il y a possibilité d'héritage multiple, il vaut mieux utiliser super() au lieu de référencer directement la super-classe.

  4. #4
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Coooool! alors va pour les "super"!
    Faut dire que j'ai toujours eu le "Parent.__init__()" facile
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

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

Discussions similaires

  1. Héritage Extend Super()
    Par Vinc06 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 16/04/2015, 12h16
  2. [OO] Implémentation de l'héritage ET d'appels super()
    Par fanfouer dans le forum Général JavaScript
    Réponses: 75
    Dernier message: 28/09/2011, 21h39
  3. [héritage] Super n'accepte pas un int ?
    Par Deallyra dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/03/2009, 11h01
  4. Héritage - super()
    Par uaz dans le forum Général Python
    Réponses: 10
    Dernier message: 27/05/2007, 07h51
  5. Réponses: 4
    Dernier message: 03/07/2006, 22h52

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