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 :

Surcharge de classe [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 17
    Points
    17
    Par défaut Surcharge de classe
    Salutations tout le monde,

    Je débute en programmation orientée objet sur Python 3.4 et j'ai découvert la notion de "surcharge de classe".
    Le problème: quand je copie-colle les exemples, rien ne marche chez moi (je suis sur Python 3.4)

    Exemple trouvé :
    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
     
    class Temps :
        """
        Classe permettant de créer des temps.
        """
     
        def __init__(self, temps) :
            """
            Constructeur de temps !
            temps : Le temps en secondes.
            """
            self.temps = temps
     
    def __str__(self) :
        """ Surcharge de la conversion en chaîne de caractères."""
        jour = self.temps//86400
        heures = (self.temps%86400)//3600
        minutes = (self.temps%3600)//60
        secondes = (self.temps%60)
        texte = ""
        if jour :
            texte += "%ij" % jour
        if heures :
            texte += "%ih" % heures
        if minutes :
            texte += "%imin" % minutes
        texte += "%is" % secondes
        return texte
     
    liste = [Temps(12), Temps(342), Temps(8456), Temps(2348509)]
    for temps in liste :
        print(temps)
    Ce me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> 
    <__main__.Temps object at 0x023B8290>
    <__main__.Temps object at 0x023F5C30>
    <__main__.Temps object at 0x023F5C50>
    <__main__.Temps object at 0x023F5C70>
    J'ai cherché un peu plus sur le web et j'ai trouvé "builtins":

    Exemple issu de la doc officielle:
    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
    import builtins
     
    def open(path):
        f = builtins.open(path, 'r')
        return UpperCaser(f)
     
    class UpperCaser:
        '''Wrapper around a file that converts output to upper-case.'''
     
        def __init__(self, f):
            self._f = f
     
        def read(self, count=-1):
            return self._f.read(count).upper()
     
        # ...
    Sauf que, comme je commence tout juste à comprendre le fonctionnement des objets sur python, je n'arrive pas à adapter cet exemple.

    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
    # Built-in namespace
    import builtins
     
    # Extended subclass
    class mystr(str):
        def first_last(self):
            if self:
                return self[0] + self[-1]
            else:
                return ''
     
    # Substitute the original str with the subclass on the built-in namespace    
    builtins.str = mystr
     
    print (str(1234).first_last())
    Je vous remercie d'avance pour vos réponse.

    Nollan

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ton premier exemple fonctionne correctement chez moi. La fonction __str__ n'est pas indentée, est-ce voulu ou une erreur de copier-coller ?

    Le deuxième, tu ne dis pas quel est le problème.

    Le troisième fonctionne comme attendu, as-tu un message d'erreur ?

  3. #3
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Salut,

    Merci pour ta réponse VinsS !

    Ton premier exemple fonctionne correctement chez moi. La fonction __str__ n'est pas indentée, est-ce voulu ou une erreur de copier-coller ?
    J'avais copié-collé directement le code de l'exemple. J'ai indenté la fonction __str__ et effectivement ça marche !!! Merci

    Le deuxième, tu ne dis pas quel est le problème.
    C'est un exemple que j'ai trouvé dans la doc Python. Il n'y a pas vraiment de problème, à par que je ne le comprends pas vraiment, et donc je ne sais pas comment l'adapter.

    Le troisième fonctionne comme attendu, as-tu un message d'erreur ?
    Je n'ai aucun message d'erreur. Ca n'affiche rien...
    Voici ce que donne l'IDLE quand j'exécute l'exemple 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
     
    >>> ================================ RESTART ================================
    >>>

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par nollan Voir le message
    C'est un exemple que j'ai trouvé dans la doc Python. Il n'y a pas vraiment de problème, à par que je ne le comprends pas vraiment, et donc je ne sais pas comment l'adapter.
    Ce 2ième code est une astuce pour redéfinir open pour la lecture des fichiers texte afin qu'il ne renvoie que des lignes en majuscules.

    => comme le "def open(...)" écrase le open habituel, et on a besoin du module standard "builtins" pour le retrouver => builtins.open(...).


    Pour le 3ième exemple, ce n'est pas "builtins.str = mystr" mais "str = mystr".

    Ce genre d'exercice est pour comprendre comment fonctionne Python, mais si tu peux éviter ce genre d'astuce dans les programmes courants, ce n'est pas plus mal.

    (NB: la convention est de commencer les noms de classe par une majuscule: "Mystr")
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Merci pour la réponse !

    Citation Envoyé par tyrtamos Voir le message
    Pour le 3ième exemple, ce n'est pas "builtins.str = mystr" mais "str = mystr".
    J'ai modifié et ça marche. Donc "builtins" est inutile...

    En fait: j'utilise Python entre autre pour faire du traitement par lot sur des fichiers Latex.
    J'ai une fonction remplaceEtoile qui marche bien et qui donne ça par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a="blabla $$f(x)=x+3$$ blabla $$g(x)=x-3$$ blabla"
    >>> print(remplaceEtoile(a,"$$*$$","\[*\]"))
    blabla \[f(x)=x+3\] blabla \[g(x)=x-3\] blabla
    Je peux maintenant l'utiliser comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a="blabla $$f(x)=x+3$$ blabla $$g(x)=x-3$$ blabla"
    >>> print(str(a).remplaceEtoile("$$*$$","\[*\]"))
    blabla \[f(x)=x+3\] blabla \[g(x)=x-3\] blabla
    Du coup je peux mettre plusieurs "regles" dans un dictionnaire et boucler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dicoRegles={1:"remplaceEtoile(\"$$*$$\",\"\[*\]\")",2:"remplaceEtoile(\"\center *\n\",\"\begin{center}\n    *\n\end{center)\n\")"}
    for cle in dicoRegles:
        texteSortie=eval("str(texteSortie)"+"."+dicoRegles[cle])
    PS: J'ai tenté d'obtenir la même chose que ma fonction remplaceEtoile avec des expressions régulières, mais je n'ai pas réussi...

    Merci pour vos réponses.
    Je passe le sujet en Résolu

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

Discussions similaires

  1. [Débutant] Surcharge de classe
    Par soso78 dans le forum C#
    Réponses: 1
    Dernier message: 30/11/2011, 17h19
  2. Surcharge de classe interne lors d'héritage?
    Par big x dans le forum Langage
    Réponses: 3
    Dernier message: 21/06/2007, 15h22
  3. Surcharge de classes Struts
    Par blbird dans le forum Struts 1
    Réponses: 8
    Dernier message: 10/11/2006, 13h08
  4. [C#] Comment surcharger la classe DataGrid ?
    Par Dozer71 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 27/07/2006, 13h43
  5. [MFC] surcharger une classe
    Par exter666 dans le forum MFC
    Réponses: 9
    Dernier message: 16/03/2005, 00h53

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