IC # nous le faisons par réflexion. En Javascript, c'est simple comme:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Comment le faire en Python?
python
reflection
properties
Jader Dias
la source
la source
@property
.Réponses:
Sachez que dans de rares cas, il existe une
__slots__
propriété, ces classes n'en ont souvent pas__dict__
.la source
__setattr__()
. La définition de valeurs directement sur le dictionnaire contourne le setter de l'objet (et / ou ses parents). Il est assez courant en python que plus de choses quesetattr()
ce que vous voyez se produisent en arrière-plan lors de la définition des attributs (par exemple, l'assainissement), en utilisant garantit que vous ne les manquez pas, ou êtes obligé de les gérer vous-même explicitement.vars()
ne renvoie que les membres statiques (c'est-à-dire, les attributs d'objet et les méthodes enregistrés avec cet objet__dict__
). Il ne renvoie pas de membres dynamiques (c'est-à-dire des attributs d'objet et des méthodes définis dynamiquement par la__getattr__()
méthode de cet objet ou par une magie similaire). Selon toute vraisemblance, lafile.ImplementationName
propriété souhaitée est définie dynamiquement et n'est donc pas disponible pourvars()
oudir()
.Voir
inspect.getmembers(object[, predicate])
.la source
attributes
place demembers
(y a-t-il une différence entre les deux?). Ils auraient pu corriger le nom dans Python 3.0 pour le rendre cohérent.__dict__
, désolé.inspect.getmembers()
enveloppementsdir()
avec les avantages secondaires ( la plupart du temps négligeable) de (A) , y compris les attributs de la classe dynamique et attributs de métaclasse et (B) à l' exclusion des membres ne correspondant le prédicat passé. Bailler, non?inspect.getmembers()
convient aux bibliothèques tierces prenant en charge de manière générique tous les types d'objets possibles. Pour les cas d'utilisation standard, cependant, celadir()
suffit absolument.dir()
est le moyen le plus simple. Vois ici:Guide de l'introspection Python
la source
dir()
merci.La
__dict__
propriété de l'objet est un dictionnaire de toutes ses autres propriétés définies. Notez que les classes Python peuvent remplacer getattr et créer des éléments qui ressemblent à des propriétés mais qui ne le sont pas__dict__
. Il y a aussi les fonctions intégréesvars()
etdir()
qui sont différentes de manière subtile. Et__slots__
peut remplacer__dict__
dans certaines classes inhabituelles.Les objets sont compliqués en Python.
__dict__
est le bon point de départ pour une programmation de type réflexion.dir()
est le point de départ si vous piratez dans un shell interactif.la source
print vars.__doc__
indique queWith an argument, equivalent to object.__dict__
Alors quelles seraient les différences subtiles?georg scholly version plus courte
la source
Si vous recherchez le reflet de toutes les propriétés, les réponses ci-dessus sont excellentes.
Si vous cherchez simplement à obtenir les clés d'un dictionnaire (qui est différent d'un 'objet' en Python), utilisez
my_dict.keys()
la source
obj['key']
vs.obj.property
) et la question portait sur les propriétés des objets. Je mets ma réponse ici car il y a une confusion facile entre les deux.Ceci est totalement couvert par les autres réponses, mais je vais le rendre explicite. Un objet peut avoir des attributs de classe et des attributs d'instance statiques et dynamiques.
stasis
est statique,dyno
dynamique (cf. propriété décorateur) etclassy
est un attribut de classe. Si nous faisons simplement__dict__
ouvars
nous n'obtiendrons que le statique.Donc, si nous voulons, les autres
__dict__
auront tout (et plus). Cela inclut les méthodes et attributs magiques et les méthodes liées normales. Alors évitons ceux-ci:La
type
méthode appelée avec une propriété décorée (un attribut dynamique) vous donnera le type de la valeur retournée, nonmethod
. Pour prouver cela, json le stringify:Si cela avait été une méthode, cela se serait écrasé.
TL et DR. essayez d'appeler
extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
les trois, mais pas de méthodes ni de magie.la source