137 votes

Python - Obtenir les variables d'instance

Existe-t-il une méthode intégrée en Python pour obtenir un tableau de toutes les variables d'instance d'une classe? Par exemple, si j'ai ce code:

 class hi:
  def __init__(self):
    self.ii = "foo"
    self.kk = "bar"
 

Y a-t-il un moyen pour moi de faire ceci:

 >>> mystery_method(hi)
["ii", "kk"]
 

Merci les gars!

Edit: Au départ, j'avais demandé des variables de classe par erreur. Merci à tous ceux qui ont porté cela à mon attention!

158voto

cnu Points 6802

Chaque objet a une variable __dict__ contenant toutes les variables et ses valeurs.

Essaye ça

 >>> hi_obj = hi()
>>> hi_obj.__dict__.keys()
 

113voto

Jeremy Cantrell Points 7858

Utilisez vars ()

 class Foo(object):
    def __init__(self):
        self.a = 1
        self.b = 2

vars(Foo()) #==> {'a': 1, 'b': 2}
vars(Foo()).keys() #==> ['a', 'b']
 

18voto

Thomas Wouters Points 38811

Vous ne pouvez normalement pas avoir instance attributs dans une classe, au moins pas sans l'instanciation de la classe. Vous pouvez obtenir de l'instance attributs donné un exemple, bien que, ou les attributs de classe donné une classe. Voir le "inspecter" module. Vous ne pouvez pas obtenir une liste des attributs d'instance parce que les instances ne peut vraiment rien avoir comme attribut, et-comme dans votre exemple, la voie normale de les créer est juste d'attribuer à eux dans le __init__ de la méthode.

Une exception est si votre classe utilise des machines à sous, qui fixe la liste des attributs de la classe permet aux instances avoir. Les fentes sont expliquées dans http://www.python.org/2.2.3/descrintro.htmlmais il y a de divers pièges avec des fentes; ils affectent disposition de la mémoire, de sorte que l'héritage multiple peut être problématique, et de l'héritage du général de prendre les fentes en compte.

14voto

dmark Points 71

Les méthodes Vars () et dict fonctionneront pour l'exemple affiché par le PO, mais ne fonctionneront pas pour des objets définis "de manière lâche" tels que:

 class foo:
  a = 'foo'
  b = 'bar'
 

Pour imprimer tous les attributs non appelables, vous pouvez utiliser la fonction suivante:

 def printVars(object):
    for i in [v for v in dir(object) if not callable(getattr(object,v))]:
        print '\n%s:' % i
        exec('print object.%s\n\n') % i
 

12voto

daniel Points 897

Vous pouvez également tester si un objet a une variable spécifique avec:

 >>> hi_obj = hi()
>>> hasattr(hi_obj, "some attribute")
 

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