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 :

utilisation de super pour appeler une methode de la classe parente dans la meme methode de la classe dérivée [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut utilisation de super pour appeler une methode de la classe parente dans la meme methode de la classe dérivée
    Bonjour,

    Je voudrais surcharger la classe file (pour dans un cas précis de fichier, filtrer certaines lignes, en modifier d'autres)

    J'ai un problème de récursion infinie dans la méthode __iter__ que j'ai définie dans ma classe dérivée.
    Comme si l'appel à super(classedérivéedefile,self).__iter__() appelait en fait classederiveedefile.__iter__ au lieu de file.__iter__

    J'imagine que file a bien une methode __iter__, puisqu'on peut itérer dessus ?

    Voici le 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
    #!/usr/bin/python
    mport os
    import sys
     
    class MachinFile(file):
      def __init__(self, name, errfile, *args, **kwargs):
        self.errfile=errfile
        super(MachinFile,self).__init__(name, *args,**kwargs)
     
      def __iter__(self):
        for l in super(MachinFile,self).__iter__(): # est ce que ce n est pas le __iter__ de la classe derivee qui est appelée ?
          yield l+self.errfile
     
    with MachinFile("ess.py","search") as f:
      for l in f:
        print(l)
    ET voici la sortie :

    ...
    for l in s:
    File "./ess.py", line 16, in __iter__
    for l in s:
    File "./ess.py", line 16, in __iter__
    for l in s:
    RuntimeError: maximum recursion depth exceeded while calling a Python object

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Pouvez-vous expliquez pourquoi l'erreur

    alors que vous faîtes

    ?

    À part que le test que vous faîtes ne soit pas en corrélation avec le code présenté, je ne vois pas ! Merci d'apporter une cohérence...

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Où est définie la classe file ?

  4. #4
    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,

    Citation Envoyé par zequiche Voir le message
    J'ai un problème de récursion infinie dans la méthode __iter__ que j'ai définie dans ma classe dérivée.
    Vous avez 2 protocoles pour réaliser un itérateur avec __iter__: celui qui fait des yield et celui qui retourne self avec une méthode next retournant chaque élément.
    De fait, si vous surchargez __iter__, il faut que le protocole reste cohérent avec celui de la classe parente.

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

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Merci de ces réponses.
    Je dois donc surcharger next() ?
    Je vais essayer et je vous tiens au courant.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    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
    17
     
    #!/usr/bin/python
    import os
    import sys
     
    class MachinFile(file):
      def __init__(self, name, errfile, *args, **kwargs):
        self.errfile=errfile
        super(MachinFile,self).__init__(name, *args,**kwargs)
     
      def next(self):
        l=super(MachinFile,self).next()
        return l+"coucou"
     
    with MachinFile("fichier_a_lire","search") as f:
      for l in f:
        print(l)

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Oui tu peux aussi surcharger la méthode __iter__ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def __iter__(self):
        while True:
            try:
                line = super(MachinFile, self).next()
                yield line.rstrip() + self.errfile
            except StopIteration:
                break

  8. #8
    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
    Citation Envoyé par fred1599 Voir le message
    Oui tu peux aussi surcharger la méthode __iter__ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def __iter__(self):
        while True:
            try:
                line = super(MachinFile, self).next()
                yield line.rstrip() + self.errfile
            except StopIteration:
                break
    Certes mais si on fait comme çà, on casse le comportement de "next" i.e. une suite d'appels à next ne retournera pas la même chose que "for .... in ...".

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

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

Discussions similaires

  1. Utilisation du mot prototype pour appeler une function/method
    Par Mandotnet dans le forum TypeScript
    Réponses: 2
    Dernier message: 19/05/2016, 11h19
  2. Réponses: 3
    Dernier message: 16/09/2014, 10h36
  3. utiliser CallWindowProc pour appeler une fonction
    Par cbleas dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2009, 07h17
  4. Réponses: 1
    Dernier message: 15/05/2006, 18h43
  5. Utiliser une touche pour appeller une fonction
    Par Hide dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2005, 16h59

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