119 votes

Boucler sur toutes les variables membres d'une classe en python

Comment obtenir une liste de toutes les variables d'une classe itérable ? Un peu comme locals(), mais pour une classe

class Example(object):
    bool143 = True
    bool2 = True
    blah = False
    foo = True
    foobar2000 = False

    def as_list(self)
       ret = []
       for field in XXX:
           if getattr(self, field):
               ret.append(field)
       return ",".join(ret)

cela devrait donner

>>> e = Example()
>>> e.as_list()
bool143, bool2, foo

0 votes

Pourquoi ne peut-on pas utiliser for field in [ self.bool143, self.bool2, self.blah, self.foo, self.foobar2000 ] ? Comment se fait-il que vous ne connaissiez pas les variables d'instance de la classe ?

4 votes

S.Lott : c'est ce que j'ai fini par faire de toute façon. Dans mon code réel, j'ai environ 40 variables, et j'ai pensé que ce serait mieux et plus DRY de ne pas avoir à faire manuellement la liste des itérations.

3 votes

187voto

truppo Points 10346
dir(obj)

vous donne tous les attributs de l'objet. Vous devez filtrer vous-même les membres, les méthodes, etc :

class Example(object):
    bool143 = True
    bool2 = True
    blah = False
    foo = True
    foobar2000 = False

example = Example()
members = [attr for attr in dir(example) if not callable(getattr(example, attr)) and not attr.startswith("__")]
print members   

Vous donnera :

['blah', 'bool143', 'bool2', 'foo', 'foobar2000']

10 votes

Pourquoi instancier un objet : dir(Exemple()) au lieu de la classe type dir(Exemple)

2 votes

Parce que je suppose que le PO cherche des variables d'instance (qui peuvent ne pas être présentes dans la classe).

9 votes

Et comment obtenez-vous les valeurs ?

151voto

Nimo Points 527

Si vous voulez seulement les variables (sans les fonctions), utilisez :

vars(your_object)

5 votes

Vous devez toujours filtrer vars mais c'est la bonne réponse

3 votes

J'aime beaucoup cette approche. Je vais l'utiliser pour savoir ce qu'il faut sérialiser avant d'envoyer des états sur le réseau, par exemple...

12 votes

vars hace no inclure les variables de classe, seulement les variables d'instance.

31voto

user235925 Points 213

@truppo : votre réponse est presque correcte, mais callable retournera toujours false puisque vous ne faites que passer une chaîne de caractères. Vous avez besoin de quelque chose comme ce qui suit :

[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")]

qui filtrera les fonctions

0 votes

ClassName.__dict__["__doc__"] Cela permet de filtrer les fonctions, les variables intégrées, etc., et de n'obtenir que les champs dont vous avez besoin !

6voto

balpha Points 18387
>>> a = Example()
>>> dir(a)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__',
'__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', 'bool143', 'bool2', 'blah',
'foo', 'foobar2000', 'as_list']

-comme vous le voyez, cela vous donne tous attributs, donc vous devrez filtrer un peu. Mais en gros, dir() est ce que vous recherchez.

0 votes

ClassName.__dict__["__doc__"] Cela permet de filtrer les fonctions, les variables intégrées, etc., et de n'obtenir que les champs dont vous avez besoin !

1voto

Mehdi Points 324

Similaire à vars() on peut utiliser le code ci-dessous pour lister tous les attributs de la classe. Il est équivalent à vars(example).keys() .

example.__dict__.keys()

0 votes

ClassName.__dict__["__doc__"] Cela permet de filtrer les fonctions, les variables intégrées, etc., et de n'obtenir que les champs dont vous avez besoin !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X