482 votes

Obtenir tous les attributs d'un objet en Python ?

Y a-t-il un moyen d'obtenir todo attributs/méthodes/champs/etc. d'un objet en Python ?

vars() es fermer à ce que je veux, mais cela ne fonctionne pas à moins qu'un objet ait une __dict__ ce qui n'est pas toujours vrai (par exemple, ce n'est pas vrai pour une list , a dict etc.).

0 votes

Pour obtenir les attributs d'un attrs l'objet, il y a __attrs_attrs__ .

655voto

mouad Points 21520

Utilisez la fonction intégrée dir() .

20 votes

Noter que le comportement de dir() est souvent manipulé pour montrer intéressant plutôt que strictement tous ; par exemple, il ne montre pas les attributs hérités d'une métaclasse, ou il peut être surchargé avec un attribut __dir__ méthode.

9 votes

@TokenMacGuy : C'est bien pour ce dont j'ai besoin... y penser trop me donnerait un mal de tête. ;)

0 votes

Il ne montre pas non plus les propriétés d'introspection telles que func_defaults .

114voto

Eli Collins Points 3311

Ce que vous voulez probablement, c'est dir() .

Le hic, c'est que les classes peuvent remplacer la fonction spéciale __dir__ ce qui entraîne dir() pour retourner ce que la classe veut (bien qu'ils soient encouragés à retourner une liste précise, cela n'est pas imposé). De plus, certains objets peuvent implémenter des attributs dynamiques en surchargeant la fonction __getattr__ peuvent être des objets proxy RPC, ou des instances de classes d'extension C. Si votre objet est l'un de ces exemples, il se peut qu'il n'ait pas d'objet __dict__ ou être en mesure de fournir une liste complète d'attributs par l'intermédiaire de __dir__ la plupart de ces objets peuvent avoir tellement d'attributs dynamiques qu'il ne sait pas vraiment ce qu'ils font. ce que qu'il a jusqu'à ce que vous essayiez d'y accéder.

A court terme, si dir() n'est pas suffisant, vous pouvez écrire une fonction qui traverse __dict__ pour un objet, alors __dict__ pour toutes les classes de obj.__class__.__mro__ ; cependant, cela ne fonctionnera que pour les objets normaux de Python. À long terme, vous devrez peut-être utiliser la typographie du canard + des hypothèses - si ça ressemble à un canard, croisez les doigts et espérez que c'en est un .feathers .

0 votes

Que faire si je veux stocker les résultats renvoyés par dir() ?

8 votes

Je ne sais pas si c'est ce que vous cherchez, mais... attrs = dir(obj) stockera le tableau d'attributs sous forme de chaînes de caractères dans le fichier attrs . Ensuite, pour y accéder, vous pouvez toujours utiliser getattr(obj, attrs[i]) pour obtenir le i e attribut dans le attrs le tableau.

2 votes

__dict__ cette fonction m'a beaucoup aidé.

113voto

Kamika Points 328

Yo uso __dict__ y dir(<instance>)

Exemple :

class MyObj(object):
  def __init__(self):
    self.name = 'Chuck Norris'
    self.phone = '+6661'

obj = MyObj()
print(obj.__dict__)
print(dir(obj))

# Output:  
# obj.__dict__ --> {'phone': '+6661', 'name': 'Chuck Norris'}
#
# dir(obj)     --> ['__class__', '__delattr__', '__dict__', '__doc__',
#               '__format__', '__getattribute__', '__hash__', 
#               '__init__', '__module__', '__new__', '__reduce__', 
#               '__reduce_ex__', '__repr__', '__setattr__', 
#               '__sizeof__', '__str__', '__subclasshook__', 
#               '__weakref__', 'name', 'phone']

18 votes

L'OP spécifiquement mentionne qu'il est intéressé par les cas où il n'y a pas de __dict__ - sinon il pourrait utiliser vars

1 votes

Vars() est proche de ce que je veux, mais il ne fonctionne pas à moins qu'un objet ait une valeur de dict ce qui n'est pas toujours vrai (par exemple, ce n'est pas vrai pour une liste, un dict, etc.). Il a clairement dit que ce n'était PAS ce qu'il voulait.

62voto

Jason Angel Points 558

Vous pouvez utiliser dir(your_object) pour obtenir les attributs et getattr(your_object, your_object_attr) pour obtenir les valeurs

usage :

for att in dir(your_object):
    print (att, getattr(your_object,att))

1 votes

Merci, c'est ce que je cherchais depuis longtemps.

2 votes

for attr in dir(obj): print(attr +'()') if callable(getattr(obj, attr)) else print(attr) # Imprime les parenthèses immédiatement après les éléments appelables (fonctions, méthodes, classes, etc.).

0 votes

Btw, ce formatage print(f'{att} : {getattr(myobject,att)}\n') peut vous aider à mieux lire vos résultats

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