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?
@property
.
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?
@property
.
Réponses:
for property, value in vars(theObject).iteritems():
print property, ": ", value
Sachez que dans de rares cas, il existe une __slots__
propriété, ces classes n'en ont souvent pas __dict__
.
__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 que setattr()
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, la file.ImplementationName
propriété souhaitée est définie dynamiquement et n'est donc pas disponible pour vars()
ou dir()
.
Voir inspect.getmembers(object[, predicate])
.
Renvoie tous les membres d'un objet dans une liste de paires (nom, valeur) triées par nom. Si l'argument de prédicat facultatif est fourni, seuls les membres pour lesquels le prédicat renvoie une valeur vraie sont inclus.
>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
attributes
place de members
(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()
enveloppements dir()
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, cela dir()
suffit absolument.
dir()
est le moyen le plus simple. Vois ici:
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ées vars()
et dir()
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.
print vars.__doc__
indique que With an argument, equivalent to object.__dict__
Alors quelles seraient les différences subtiles?
georg scholly version plus courte
print vars(theObject)
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()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
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.
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
est statique, dyno
dynamique (cf. propriété décorateur) et classy
est un attribut de classe. Si nous faisons simplement __dict__
ou vars
nous n'obtiendrons que le statique.
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
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:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
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, non method
. Pour prouver cela, json le stringify:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
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.