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

  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

  9. #9
    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
    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 ...".
    Je ne pense pas casser le comportement de next méthode de la classe file, pour en changer le comportement, il me semble que l'on devrait là surcharger, ce qui n'est pas le cas ici.

    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with MachinFile("fichier_a_lire", "search") as f:
        while True:
            try:
                l = next(f).rstrip()
                print l
            except StopIteration:
                break
    Normalement je devrais retourner mes lignes de fichier avec la méthode next de base de l'objet file, non ? Ou y a-t-il un bug dans ma compréhension ?

  10. #10
    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
    Je ne pense pas casser le comportement de next méthode de la classe file, pour en changer le comportement, il me semble que l'on devrait là surcharger, ce qui n'est pas le cas ici.
    Ben for...in... retournera des lignes de la forme XXXX + ZZZ alors que next ne retournera que XXXX comme si MachinFile n'était plus au milieu pour y ajouter ZZZ.

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

  11. #11
    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 effectivement ça se tient, en y réfléchissant c'est logique que les deux fassent un résultat similaire.

  12. #12
    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 effectivement ça se tient, en y réfléchissant c'est logique que les deux fassent un résultat similaire.
    D'un autre côté, si on dit que la classe MachinChose est un objet de type file qui ajoute un suffixe à toute ligne lue, il y a encore du boulot (d'autant qu'on n'est pas tenu de lire un fichier ligne par ligne)...
    De fait, écrire une fonction genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def add_suffix(f, tag):
        for line in f:
            yield line.rstrip() + tag
    suffirait largement...
    Je comprends que lorsqu'on découvre les class on ait envie de les utiliser à tout et n'importe quoi pour découvrir les limites de ce qu'on peut faire avec et des contraintes qu'elles imposent.

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

  13. #13
    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
    Oui,
    mais c'était pour l'exemple.En pratique je fais un peu plus de traitement que ça.
    Je ne voulais pas ajouter dans mon programme principal de traitement sur les lignes du fichier, je préfère pouvoir itérer directement sur les lignes qui m'intéressent, et déléguer le tri des lignes à la méthode __iter__.
    Je trouve qu'on comprend mieux le but du programme en le lisant (la sélection des lignes a traiter n etant pas le coeur du programme). Mais je comprend bien qu'on aurait pu faire plus simple.

+ 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