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 :

Liste des attribues dans class:


Sujet :

Python

  1. #1
    Membre éclairé Avatar de Snooky68
    Homme Profil pro
    Développeur Web/Python/PHP
    Inscrit en
    Mai 2006
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web/Python/PHP
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 273
    Par défaut Liste des attribues dans class:
    Bonjour à tous,

    Je vient de passer du PHP au python pour de la programmation web.
    Et je cherche une fonction très utile de PHP en python!

    Le faite de pouvoir boucler sur un $this! Je n'est pas trouvé comment faire quelque chose de similaire en python.

    Quelque explication supplémentaire au cas ou:
    J'ai une class de ce type en python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class essai(object):
        def __init__(self):
            self.un = "un"
            self.deux = "deux"
     
        def boucle(self):
        "Fonction qui me permet d'afficher toutes les variables de la class"
            for var in self:
               print var
    Le problème c'est que "self" dans la fonction "boucle" n'est pas un tuple, ni une liste ni quelque chose de similaire qui me permettrait de lister toute mes variables!

    Alors comment faire? Existe-t-il une solution?
    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Y'a plusieurs façons pour y arriver, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Foo(object):
        __slots__=('var1','var2')
        def __init__(self):
            self.var1=1
            self.var2=2
        def __iter__(self):
            for x in self.__slots__:
                yield getattr(self,x)
    __iter__ est très pratique pour cette situation, c'est une méthode spéciale appelée pour boucler sur l'objet, et yield est utilisé dans une fonction, pour que cette dernière retourne un générateur. Si on teste avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=Foo()
    for x in a:
        print x
    On obtient:
    pour précision, self (nommé self par convention) désigne l'instance elle-même de la classe

    Voici une méthode un poil plus élaborée:
    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 Foo(object):
        def __init__(self):
            self._recap=''
            self.var1=1
            self.var2=2
        def __setattr__(self,attr,val):
            try:
                if attr not in self._recap[:-1].split() and attr!='_recap':
                    super(Foo,self).__setattr__('_recap',self._recap+attr+' ')
            except:
                pass
            super(Foo,self).__setattr__(attr,val)
        def __iter__(self):
            for x in self._recap.split():
                yield x,getattr(self,x)

  3. #3
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    les attributs des objets sont stockés dans un dictionnaire: __dict__:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Foo(object):
        pass
     
    foo = Foo()
    foo.attr1 = 'un attribut'
    foo.attr2 = 'un second attribut'
    foo.attr3 = 3
     
    print foo.__dict__
     
    for k,v in foo.__dict__.items():
        print k, v
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {'attr2': 'un second attribut', 'attr3': 3, 'attr1': 'un attribut'}
     
    attr2 un second attribut
    attr3 3
    attr1 un attribut

  4. #4
    Membre éclairé Avatar de Snooky68
    Homme Profil pro
    Développeur Web/Python/PHP
    Inscrit en
    Mai 2006
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web/Python/PHP
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 273
    Par défaut
    Magnifique,

    Merci à vous deux pour ces astuces!
    En particulier à N.Tox.
    Ta première méthode est un peut contraignante vue qu'il faut déclarer deux fois les variables. La deuxième est plus compliqué en effet! Mais moins contraignante.
    Je vais essayer de comprendre la deuxième méthode.

    Merci aussi à pacificator, l'astuce est excellente, et je l'utiliserais surement plus tard, mais dans ce cas elle ne correspond pas car elle ne fonctionne pas à l'intérieur de l'objet.

    Donc merci à vous deux!

  5. #5
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Citation Envoyé par Snooky68 Voir le message
    Merci aussi à pacificator, l'astuce est excellente, et je l'utiliserais surement plus tard, mais dans ce cas elle ne correspond pas car elle ne fonctionne pas à l'intérieur de l'objet.
    Il suffit de l'adapter un peu et hop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Foo(object):
        def __iter__(self):
            for k,v in self.__dict__.items():
                yield k,v
     
    foo = Foo()
    foo.x = 1
    foo.y = 2
    foo.z = 3
    for name, value in foo:
        print name, value

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Mais oui ! J'avais complètement zappé le __dict__ ! Toutefois précisons que __dict__ n'est valable que si __slots__ n'est pas déclaré, dans le cas contraire, le plus rapide reste de se référer à ce dernier.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/01/2013, 10h42
  2. Liste des formulaires dans ListeBox
    Par gbuxo dans le forum Access
    Réponses: 2
    Dernier message: 08/04/2006, 11h23
  3. Réponses: 6
    Dernier message: 16/03/2006, 18h32
  4. Chargement de la liste des imprimantes dans TPrinterDialog
    Par bernie.noel dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/02/2006, 16h57
  5. [SHELL API] Liste des Icônes dans le casier (et position)..
    Par ARDILLER dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 07/05/2005, 13h37

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