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 :

comment faire pour imprimer à l'écran un objet


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Points : 15
    Points
    15
    Par défaut comment faire pour imprimer à l'écran un objet
    j'ai un objet qui contient une chaine
    et je veux que mon objet ait les mêmes méthodes qu'une chaine classique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Message
      __init__(self, txt)
        self.txt=txt
     
     
    message1=Message('bonjour')
     
    >>print message1
    La machine dit "bonjour"
     
    >>print "La machine parle : "+message1
    La machine parle : La machine dit "bonjour"

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut Re: comment faire pour imprimer à l'écran un objet
    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
    class Message:
      def __init__(self, txt):
        self.txt=txt
     
      def __str__(self):
        return self.txt
     
     
    message1=Message('bonjour')
     
    >>print message1
    La machine dit "bonjour"
     
    >>print "La machine parle : " + str(message1)
    La machine parle : La machine dit "bonjour"
    C'est un début de réponse... Dommage qu'il faille le "str" dans le deuxième cas. Il y a des interfaces en python ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Il suffirait de définir correctement les métodes
    __add__ et __radd__
    non?

    Mais comment on fait?

  4. #4
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Ouaip, t'as raison...
    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
    class Message:
      def __init__(self, txt):
        self.txt=txt
     
      def __str__(self):
        return self.txt
     
      def __add__(self, s):
        return str(self) + s
     
      def __radd__(self, s):
        return s + str(self)
     
    message1=Message('bonjour')
     
    print message1
    print message1 + " message"
    print "La machine parle : " + message1

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    super merci.

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    voici une autre piste l'utilisation de la classe str comme classe parente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Message(str):
        pass
     
    msg = Message("texte")
    print msg
    print "message :" + msg
    print msg + " spam"
    print msg[2:]
    toutes les fonctions par defaut des chaines sont utilisables.

    le_GLu

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    merci il faudra que j'y regarde : je n'y avait pas pensé mais à priori c'est loupé:
    La finialité n'est pas aussi simple: txt n'est pas formaté...

    Merci

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par GConstant
    merci il faudra que j'y regarde : je n'y avait pas pensé mais à priori c'est loupé:
    La finialité n'est pas aussi simple: txt n'est pas formaté...

    Merci
    pour modifier la chaine de caractere il faut utiliser la fonction prédéfinié __new__ et non pas __init__.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Message(str):
        def __new__(cls, value):
            return str.__new__(cls, "Message formaté: %s." % value.capitalize())
     
    >>> msg = Message('test')
    >>> print msg
    Message formaté: Test.
    >>>
    le _GLu

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    ha ba ca c'est joli.

    Le mieux c'est que tu ne pose pas de qst et on te donne la réponse quand même...

    cette fois il n'y a peut être pas mieux à faire...

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par GConstant
    cette fois il n'y a peut être pas mieux à faire..
    Quoi que:

    et si je veux que mon Message gère le formatage à l'appel...

    supposons par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Message: 
      def __init__(self, txt): 
        self.txt=txt 
     
      def __str__(self): 
        return self.txt
     
    mes = Message('bonjour %(individu)s')
     
    print str(mes) %{'individu':'toto'}
    print mes
    ce qui donne comme résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bonjour toto
    bonjour %(individu)s
    Et je veux obtenir dans le 2ème cas : "bonjour " tout court...

    PS: si je suis chiant tu peux le dire ca te fera du bien

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 89
    Points : 114
    Points
    114
    Par défaut
    Je te proposerais bien ça:
    - on hérite de str
    - on redéfinit __str__ pour qu'il supprime les formatages (%... disparait)
    - on redéfinit __mod__ pour qu'il ne lève pas l'exception KeyError

    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
    class Message(str):
     
        import re
        __fmt_re = re.compile('%(?:\((.*?)\))?([#0\- +])?([0-9]+|\*)?((?:\.[0-9]+)|\*)?[hHlL]?([diouxXeEfFgGcrs])')
     
        def original(this):
            return str.__str__(this)
     
        def __str__(this):
            s = this.original()
            s = this.__class__.__fmt_re.sub('',s)
            s = s.replace('%%','%')
            return s
     
        def __mod__(this,dic):
            try:
                s = str.__mod__(this,dic)
            except:
                s = this.original()
                m = this.__class__.__fmt_re.findall(this)
                for (key,flag,width,precision,conversion) in m:
                    f = '%'+(key and '('+key+')' or '')+flag+width+precision+conversion
                    if key not in dic.keys() and conversion != '%': s = s.replace(f, '%'+f)
                s = str.__mod__(s,dic)
            return Message(s)
     
     
    mes = Message('%%! bonjour %(individu)s, %(age)i ans')
    print mes
    print mes %{'individu':'toto'}
    print mes.original()
    %! bonjour , ans
    %! bonjour toto, ans
    %%! bonjour %(individu)s, %(age)i ans
    (J'ai mis un %% au début pour vérifier que ce cas marchait bien)

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

Discussions similaires

  1. Comment faire pour imprimer un état?
    Par Midou45 dans le forum Word
    Réponses: 10
    Dernier message: 02/01/2009, 11h41
  2. comment faire pour imprimer une partie de ma page
    Par hbar01 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/04/2008, 02h31
  3. comment faire pour imprimer?
    Par dispa dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/11/2007, 14h44
  4. Réponses: 1
    Dernier message: 06/09/2006, 18h11
  5. Comment faire pour imprimer une frame ?
    Par serialkilled dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 23/05/2006, 15h32

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