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"]
Edit: j'avais initialement demandé des variables de classe par erreur.
python
methods
instance-variables
Chris Bunch
la source
la source
Réponses:
Chaque objet a une
__dict__
variable contenant toutes les variables et ses valeurs.Essaye ça
la source
Utilisez vars ()
la source
__method
est privé,__method__
est une méthode spéciale, pas nécessairement privée; Je voudrais dire que les méthodes spéciales définissent les capacités d'un objet plutôt que les méthodes.__method__
est assez moche, et je pense qu'ils ont été nommés de cette façon pour essayer de dissuader les gens de les utiliser à moins que cela ne soit absolument nécessaire. Dans ce cas, nous avons l'alternative vars ().__str__
,__method__
sont pour la langue elle-même normalement. Que se passe-t-il quand vousstr(something)
?Vous ne pouvez normalement pas obtenir d'attributs d'instance uniquement pour une classe, du moins pas sans instancier la classe. Vous pouvez cependant obtenir des attributs d'instance pour une instance ou des attributs de classe pour une classe. Voir le module «inspecter». Vous ne pouvez pas obtenir une liste d'attributs d'instance car les instances peuvent vraiment avoir n'importe quoi comme attribut, et - comme dans votre exemple - la manière normale de les créer est de simplement leur attribuer dans la méthode __init__.
Une exception est si votre classe utilise des emplacements, qui est une liste fixe d'attributs que la classe permet aux instances d'avoir. Les slots sont expliqués dans http://www.python.org/2.2.3/descrintro.html , mais il y a plusieurs pièges avec les slots; ils affectent la disposition de la mémoire, donc l'héritage multiple peut être problématique, et l'héritage en général doit également prendre en compte les emplacements.
la source
Les méthodes Vars () et dict fonctionneront toutes les deux pour l'exemple publié par l'OP, mais elles ne fonctionneront pas pour des objets définis "vaguement" comme:
Pour imprimer tous les attributs non appelables, vous pouvez utiliser la fonction suivante:
la source
exec('print object.%s\n\n') % i
devrait être écrit commeprint getattr(object, i)
Vous pouvez également tester si un objet a une variable spécifique avec:
la source
Votre exemple montre des "variables d'instance", pas vraiment des variables de classe.
Recherchez
hi_obj.__class__.__dict__.items()
les variables de classe, ainsi que d'autres membres de la classe comme les fonctions membres et le module conteneur.Les variables de classe sont partagées par toutes les instances de la classe.
la source
Suggérer
En d'autres termes, il encapsule essentiellement __dict__
la source
Bien que ce ne soit pas directement une réponse à la question OP, il existe une manière assez douce de savoir quelles variables sont dans la portée d'une fonction. jetez un œil à ce code:
L'attribut func_code contient toutes sortes de choses intéressantes. Cela vous permet de faire des trucs sympas. Voici un exemple de la façon dont j'ai utilisé ceci:
la source
construit sur la réponse de dmark pour obtenir ce qui suit, ce qui est utile si vous voulez l'équivalent de sprintf et, espérons-le, aidera quelqu'un ...
la source
Parfois, vous souhaitez filtrer la liste en fonction des variables publiques / privées. Par exemple
la source