Est-il possible d'obtenir tous attributs/méthodes/champs/etc. d'un objet en Python?
vars()
est proche de ce que je veux, mais cela ne fonctionne que si un objet a un __dict__
, ce qui n'est pas t toujours vrai (par exemple ce n’est pas vrai pour un list
, un dict
, etc.).
Utilisez la fonction intégrée dir()
.
Ce que vous voulez probablement, c'est dir()
.
Le problème est que les classes peuvent redéfinir la méthode spéciale __dir__
, ce qui force dir()
à retourner ce que la classe souhaite (même si elles sont encouragées à renvoyer une liste précise, celle-ci n'est pas appliquée). En outre, certains objets peuvent implémenter des attributs dynamiques en remplaçant __getattr__
, peuvent être des objets proxy RPC ou des instances de classes d’extension C. Si votre objet est un de ces exemples, il se peut que leur __dict__
ou ne soit pas en mesure de fournir une liste complète d'attributs via __dir__
: beaucoup de ces objets peuvent avoir tellement d'attractions dynamiques qu'il ne saura pas réellement ce qu'il a jusqu'à ce que vous essayiez d'y accéder.
À court terme, si dir()
ne suffit pas, vous pouvez écrire une fonction qui traverse __dict__
pour un objet, puis __dict__
pour toutes les classes de obj.__class__.__mro__
; bien que cela ne fonctionne qu'avec les objets python normaux. À long terme, vous devrez peut-être utiliser la frappe avec du canard + des hypothèses - si cela ressemble à un canard, croisez les doigts et espérez que cela aura .feathers
.
J'utilise __dict__
Exemple:
class MyObj(object):
def __init__(self):
self.name = 'Chuck Norris'
self.phone = '+6661'
obj = MyObj()
print(obj.__dict__)
# Output:
# {'phone': '+6661', 'name': 'Chuck Norris'}
Vous pouvez utiliser dir(your_object)
pour obtenir les attributs et getattr(your_object, your_object_attr)
pour obtenir les valeurs.
utilisation:
for att in dir(your_object):
print (att, getattr(your_object,att))