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 :

Parcourir les éléments d'une classe


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Parcourir les éléments d'une classe
    Bonjours à tous,

    Aujourd'hui j'ai besoin de parcourir les éléments d'une classe, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class ClassBidon:
    	def __init__(self, nom , fonction, info):
    		self.nom = nom
    		self.fonction = fonction
    		self.description = info
     
    attribut1 = ClassBidon("Marc", "surveillant", "petit")
    attribut2 = Class Bidon("Paul", "visiteur", "lunettes noires")
    ect...
    Ainsi donc je souhaiterais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for attribut in ClassBidon:
        print(attribut.nom)
     
    #Pour que ceci apparaisse :
    Marc
    Paul
    ...
    Bien sûr ça ne marche pas parce qu'une classe objet n'est pas itérable. Avez vous un moyen ?

    Merci d'avance ;D

  2. #2
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ClassBidon(object):
    	def __init__(self, nom , fonction, info):
    		self.nom = nom
    		self.fonction = fonction
    		self.description = info
     
     
    attribut1 = ClassBidon("Marc", "surveillant", "petit")
    attribut2 = Class Bidon("Paul", "visiteur", "lunettes noires")
     
    attribut1.__dict__
    {'nom': 'Marc', 'description': 'petit', 'fonction': 'surveillant'}

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci Tyrus , c'est bien mais le problème n'est pas totalement résolu. Si je dois faire ça pour une centaine d'attributs ou pour plusieurs classes ! Sinon c'est une bonne roue de secours parce qu'on peut parcourir facilement le dico.

    Quelqu'un à une autre idée ?

  4. #4
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Tu peux détaillé ton prb car je ne vois pas le prb

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Eh bien comment je peu parcourir tous les attributs d'une classe pour faire dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for attribut in ClassBidon:
        print(attribut.nom)
     
    #Pour que ceci apparaisse :
    Marc
    Paul
    ...
    En gros j'ai besoin d'une solution qui me permet de ne pas avoir à taper tous les attributs d'une classe pour les manipuler. C'est pour ça que t'as technique ne convient pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    attribut1.__dict__
    {'nom': 'Marc', 'description': 'petit', 'fonction': 'surveillant'}
    parce que je dois re-taper les noms de TOUS les attributs.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    les dictionnaires ont des méthodes très utiles, notament keys() et values().

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par M.Dolly Voir le message
    Bien sûr ça ne marche pas parce qu'une classe objet n'est pas itérable.
    Si une classe est itérable. Mais l'itération ne s'appliquera que sur une instance de ta classe et ne concernera que la liste de ses attributs.
    Toi, c'est comme si t'avais
    i=10
    j=12
    k=14
    et que tu veuilles itérer un "truc" pour récupérer d'un coup 10, 12 et 14.

    Citation Envoyé par M.Dolly Voir le message
    Avez vous un moyen ?
    Les tableaux sont justement faits pour ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class ClassBidon(object):
    	def __init__(self, nom , fonction, info):
    		self.nom = nom
    		self.fonction = fonction
    		self.description = info
     
    	def __repr__(self):
    		return "nom: %s, fonction: %s, description: %s" % (self.nom, self.fonction, self.description)
     
    attribut=[]
    attribut.append(ClassBidon("Marc", "surveillant", "petit"))
    attribut.append(Class Bidon("Paul", "visiteur", "lunettes noires"))
     
    for elem in attribut: print elem
    Et si t'as besoin de plus de souplesse dans ton tableau, tu le remplaces (comme d'autres l'ont dit) par un dict.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Je ne suis pas sûr d'avoir bien compris le problème, mais voilà au moins une solution avec une classe itérable:

    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
     
    class ClassBidon(object):
        def __init__(self):
            self.L = []
            self.i = -1
     
        def ajoute(self, nom , fonction, info):
            self.L.append([nom , fonction, info])        
     
        def __iter__(self):
            return self
     
        def next(self):
            self.i += 1
            if self.i >= len(self.L):
                raise StopIteration
            self.nom = self.L[self.i][0]
            self.fonction = self.L[self.i][1]
            self.description = self.L[self.i][2]
            return self
     
    cbidon = ClassBidon()
     
    cbidon.ajoute("Marc", "surveillant", "petit")
    cbidon.ajoute("Paul", "visiteur", "lunettes noires")
    cbidon.ajoute("Toto", "concierge", "sympa")
     
    for attribut in cbidon:
        print attribut.nom
    Ce qui affiche:

    Tyrtamos
    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

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    heuuuu...
    c'est moi qui ai rien compris ou quoi ?
    il me semble que Tyrus a donner la solution dans sa premiere reponse non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    attribut1.__dict__
    {'nom': 'Marc', 'description': 'petit', 'fonction': 'surveillant'}
    il suffit d'appliquer les methodes keys() et values() pour parcourir le dictionnaire comme je l'ai dit plus haut.
    bon aller, un exemle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class ClassBidon(object):
    	def __init__(self, nom , fonction, info):
    		self.nom = nom
    		self.fonction = fonction
    		self.description = info
     
    attribut1 = ClassBidon("Marc", "surveillant", "petit")
     
    print attribut1.__dict__.keys()
    print attribut1.__dict__.values()
    ce qui retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ['nom', 'description', 'fonction']
    ['Marc', 'petit', 'surveillant']

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Je ne suis pas sûr d'avoir bien compris le problème, mais voilà au moins une solution avec une classe itérable:

    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
     
    class ClassBidon(object):
        def __init__(self):
            self.L = []
            self.i = -1
     
        def ajoute(self, nom , fonction, info):
            self.L.append([nom , fonction, info])        
     
        def __iter__(self):
            return self
     
        def next(self):
            self.i += 1
            if self.i >= len(self.L):
                raise StopIteration
            self.nom = self.L[self.i][0]
            self.fonction = self.L[self.i][1]
            self.description = self.L[self.i][2]
            return self
     
    cbidon = ClassBidon()
     
    cbidon.ajoute("Marc", "surveillant", "petit")
    cbidon.ajoute("Paul", "visiteur", "lunettes noires")
    cbidon.ajoute("Toto", "concierge", "sympa")
     
    for attribut in cbidon:
        print attribut.nom
    Ce qui affiche:

    Tyrtamos
    Ah joli. Créer une classe qui gère elle-même le tableau de datas et son itération qui renvoie une instance d'elle-même ce qui permet de se servir du résultat comme classe de base, j'aime beaucoup !!!

    Citation Envoyé par josmiley Voir le message
    heuuuu...
    c'est moi qui ai rien compris ou quoi ?
    il me semble que Tyrus a donner la solution dans sa premiere reponse non ?
    Non. La question initiale n'est pas de lister les attributs d'une classe, mais de lister les variables (avec leur contenu) qui instancient cette classe.
    Dans l'exemple initial, il y a 2 variables "attribut1" et "attribut2" (oui, le nom des variables n'est pas super super) et la question est d'afficher en une boucle les noms stockés dans ces 2 variables...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Parcourir les éléments d'une classe
    Par rvhp2 dans le forum Langage
    Réponses: 10
    Dernier message: 01/10/2008, 19h06
  2. [VB.NET 2005] Parcourir les propriétes d'une Class
    Par ricil78 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/03/2007, 21h47
  3. parcourir les éléments d'une table
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 14/01/2007, 17h50
  4. Parcourir les membres d'une classe
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2006, 22h59
  5. [VB.NET] Parcourir les attributs d'une classe
    Par pasqwal dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/02/2005, 09h47

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