2009-08-09 5 views
89

I C# lo facciamo attraverso il riflesso. In Javascript è semplice come:Come enumerare le proprietà di un oggetto in Python?

for(var propertyName in objectName) 
    var currentPropertyValue = objectName[propertyName]; 

come farlo in Python?

+1

collegando questo: [? Come si ottiene la lista dei metodi in una classe Python] (http: //stackoverflow.com/questions/1911281/how-do-you-get-list-of-methods-in-a-python-class) –

risposta

102
for property, value in vars(theObject).iteritems(): 
    print property, ": ", value 

essere consapevoli che in alcuni rari casi c'è una proprietà __slots__, tali classi spesso non hanno __dict__.

+1

ora come modificare il valore? in Javascript puoi fare: object [proprietà] = newValue. Come farlo in Python? –

+0

Ho capito: objectName .__ dict __ [propertyName] = newValue –

+34

usa invece setattr(). – Nelson

35

dir() è il modo semplice. Vedi qui:

Guide To Python Introspection

+0

Qualcosa da notare dai documenti Python, perché dir() viene fornito principalmente come utilità per l'uso a un prompt interattivo, tenta di fornire un insieme interessante di nomi più di quello che prova a fornire un insieme di nomi rigorosamente o coerentemente definito, e il suo comportamento dettagliato potrebbe cambiare tra le versioni. Ad esempio, gli attributi metaclass non si trovano nell'elenco dei risultati quando l'argomento è una classe._ – skyler

10

La __dict__ proprietà dell'oggetto è un dizionario di tutte le altre proprietà definite. Si noti che le classi Python possono sovrascrivere getattr e creare oggetti simili a proprietà ma non in __dict__. Ci sono anche le funzioni integrate vars() e dir() che sono diverse in modi sottili. E __slots__ può sostituire __dict__ in alcune classi insolite.

Gli oggetti sono complicati in Python. __dict__ è il posto giusto per iniziare la programmazione in stile riflesso. dir() è il punto da cui partire se si sta facendo un giro in una shell interattiva.

+0

'print vars .__ doc__' indica che' Con un argomento, equivalente all'oggetto .__ dict__' Quindi quali sarebbero le differenze sottili? –

57

Vedere inspect.getmembers(object[, predicate]).

Restituisce tutti i membri di un oggetto in un elenco di coppie (nome, valore) ordinate per nome. Se viene fornito l'argomento del predicato facoltativo, vengono inclusi solo i membri per i quali il predicato restituisce un valore reale.

>>> [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'] 
>>> 
+0

Sì, questa risposta è ottima; mai usato questo modulo prima. getmembers() è implementato semplicemente camminando i risultati di dir (oggetto), btw. – Nelson

+0

Puoi spiegare perché è meglio che accedere a __dict__? La documentazione di Python è meno che utile, specialmente perché normalmente usa il termine 'attributes' invece di' members' (c'è qualche differenza tra i due?). Avrebbero potuto correggere il nome in Python 3.0 per renderlo coerente. – nikow

+0

Oops, significa '__dict__', mi spiace. – nikow

8

Georg Scholly più breve versione

print vars(theObject) 
4

Se siete in cerca di riflessione di tutte le proprietà, le risposte di cui sopra sono grandi.

Se si sta semplicemente cercando di ottenere le chiavi di un oggetto, utilizzare

my_dict.keys()

my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' } 
my_dict.keys() 
> ['abc', 'def', 'ghi'] 
+0

deve essere accettato risposta – danday74

+0

anche se è la mia risposta, non penso che dovrebbe essere la risposta accettata: le chiavi di un oggetto sono diverse dalla proprietà di un'istanza di oggetto di una classe. Sono accessibili in modo diverso ('obj ['key']' vs. 'obj.property') e la domanda riguardava le proprietà dell'oggetto. Ho messo la mia risposta qui perché c'è una facile confusione tra i due. – MrE