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()


Sujet :

Python

  1. #1
    uaz
    uaz est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Par défaut Héritage - super()
    Salut à tous,

    J'ai un problème en utilisant la fonction super()
    Je veux utiliser la méthode définie dans une super classe de manière à éviter une redondance de code et ajouter du code propre à la sous-classe.

    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
     
    # super-classe
    class blah:
        def meuh(self, zip):
            print "meuh"
     
    # sous-classe
    class blahblah(blah):
        def meuh(self, zip):
            super(type(blahblah)).meuh(zip)
            # ...
     
    def main12():
        b2 = blahblah()
        b2.meuh(0)
    P:\travail\test>python.exe "P:\travail\test\test2.py"
    Traceback (most recent call last):
    File "P:\travail\test\test2.py", line 238, in ?
    main12()
    File "P:\travail\test\test2.py", line 11, in main12
    b2.meuh(0)
    File "P:\travail\test\test2.py", line 7, in meuh
    super(type(blahblah)).meuh(zip)
    AttributeError: 'super' object has no attribute 'meuh'


    En gros, je me retrouve avec un objet de type 'super' et pas la super classe de l'objet 'blahblah' Bref, je comprends pas bien comment ça marche

  2. #2
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Par défaut
    je ne connais pas super mais pour l'héritage il y a aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class blahblah(blah): 
        def meuh(self, zip): 
            blah.meuh(self, zip)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 3
    Par défaut
    Citation Envoyé par GConstant
    je ne connais pas super mais pour l'héritage il y a aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class blahblah(blah): 
        def meuh(self, zip): 
            blah.meuh(self, zip)

    C'est ce que j'allais dire ^^

    Si t'a vraiment besoin de super, ta classe blah DOIT etre dérivée de object (c'est le nouveau style de classe de Python)

    --> ca donne ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # super-classe
    class blah(object):
        def meuh(self, zip):
            print "meuh"
     
    # sous-classe
    class blahblah(blah):
        def meuh(self, zip):
            super(blahblah,self).meuh(zip)
            # ...
     
    def main12():
        b2 = blahblah()
        b2.meuh(0)

  4. #4
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Par défaut
    je viens de regarder la doc et j'ai repiqué l'exemple de base indiqué
    (j'ai rajouté la classe B sinon ca ne risquait pas de marcher)
    cela donne ce qui suit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class B:
      def meth(self, arg):
        print arg
     
    class C(B):
      def meth(self, arg):
          super(C, self).meth(arg)
     
    c=C()
    c.meth('a')
    et... ca ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "tt.py", line 11, in ?
        c.meth('a')
      File "tt.py", line 8, in meth
        super(C, self).meth(arg)
    TypeError: super() argument 1 must be type, not classobj
    Alors il doit y a avoir une subtilité...

  5. #5
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Par défaut
    Citation Envoyé par Tokiros
    Si t'a vraiment besoin de super, ta classe blah DOIT etre dérivée de object (c'est le nouveau style de classe de Python
    Merci j'étais en train de taper

    Et si tu hérite déjà d'un Build-In type ('str' par exemple)
    ou de 'userString' :

  6. #6
    uaz
    uaz est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Par défaut
    Citation Envoyé par GConstant
    je viens de regarder la doc et j'ai repiqué l'exemple de base indiqué
    (j'ai rajouté la classe B sinon ca ne risquait pas de marcher)
    cela donne ce qui suit.

    et... ca ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "tt.py", line 11, in ?
        c.meth('a')
      File "tt.py", line 8, in meth
        super(C, self).meth(arg)
    TypeError: super() argument 1 must be type, not classobj
    Alors il doit y a avoir une subtilité...
    Oui, il y'a une erreur dans la doc, il faut faire :
    super(type(C), self).meth(arg)

    Et là encore j'ai une erreur qui me dit que self (le 2ème argument) doit être soit une instance soit un autre type
    (vraiment pas au point leur fonction 'super')

  7. #7
    uaz
    uaz est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Par défaut
    Voilà la fameuse erreur avec le code de l'exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class C(B): 
      def meth(self, arg): 
          print type(self)
          super(type(C), self).meth(arg)
    P:\travail\test>python.exe "P:\travail\test\test2.py"
    <type 'instance'>

    Traceback (most recent call last):
    File "P:\travail\test\test2.py", line 11, in ?
    c.meth('a')
    File "P:\travail\test\test2.py", line 8, in meth
    super(type(C), self).meth(arg)
    TypeError: super(type, obj): obj must be an instance or subtype of type

  8. #8
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Par défaut
    Citation Envoyé par uaz
    vraiment pas au point leur fonction 'super'
    C'est aussi ce que je me disais...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 3
    Par défaut
    Ben, faut l'utiliser comme il faut, c'est tout ^^

    Le probleme de l'exemple, c'est qu'ils donnent pas la definition de la classe B

    la classe B DOIT etre dérivée de 'object', c'est mis dans la doc

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Par défaut la ca marche
    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 A:
        def __init__(self):
            print 'A'
     
    class B(A):
        def __init__(self):
            super(type(B),A).__init__(type(B)) 
            print 'B'
     
    def main():
        b = B()
     
    if __name__ == '__main__':
        main()

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 93
    Par défaut c est plutot ca
    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 blah(object):##heritage de object obligatoire
        def meuh(self,zip):
            print "meuh"
     
    # sous-classe
    class blahblah(blah):
        def meuh(self,zip):##surcharge
            super(blahblah,self).meuh(zip)##appel du constructeur de la classe mere
            # ...
     
    def main12():
        b2 = blahblah()
        b2.meuh(0)
    main12()

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. Héritage, super, __init__
    Par afranck64 dans le forum Général Python
    Réponses: 3
    Dernier message: 10/01/2012, 16h28
  3. [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
  4. [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
  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