2009-08-09 43 views
89

I C# Wir tun es durch Reflexion. In Javascript ist es einfach wie folgt:Wie listet man die Eigenschaften eines Objekts in Python auf?

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

Wie geht das in Python?

+1

diese Verknüpfung: [? Wie Sie die Liste von Methoden in einer Python-Klasse erhalten haben] (http: //stackoverflow.com/questions/1911281/how-do-you-get-list-of-methods-in-a-python-class) –

Antwort

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

Beachten Sie, dass in einigen seltenen Fällen eine gibt es __slots__ Eigenschaft haben solche Klassen oft keine __dict__.

+1

jetzt, wie man den Wert ändert? In Javascript könnte man folgendes tun: object [property] = newValue. Wie geht es in Python? –

+0

Ich habe es: objectName .__ dict __ [propertyName] = newValue –

+34

verwenden Sie stattdessen setattr(). – Nelson

35

dir() ist der einfache Weg. Siehe hier:

Guide To Python Introspection

+0

Etwas, das in den Python-Dokumenten zu beachten ist, _ da dir() hauptsächlich als Annehmlichkeit zur Verwendung an einer interaktiven Eingabeaufforderung bereitgestellt wird, versucht es, eine interessante Gruppe von Namen mehr zu liefern, als es versucht, einen streng oder einheitlich definierten Satz von Namen zu liefern. und sein detailliertes Verhalten kann sich in den Versionen ändern. Zum Beispiel sind Metaklassenattribute nicht in der Ergebnisliste, wenn das Argument eine Klasse ist. – skyler

10

Die __dict__ Eigenschaft des Objekts ist ein Wörterbuch aller anderen definierten Eigenschaften. Beachten Sie, dass Python-Klassen getattr überschreiben und Dinge erstellen können, die wie Eigenschaften aussehen, aber nicht in __dict__ sind. Es gibt auch die eingebauten Funktionen vars() und dir(), die auf subtile Weise unterschiedlich sind. Und __slots__ kann in einigen ungewöhnlichen Klassen ersetzen.

Objekte sind in Python kompliziert. __dict__ ist der richtige Ort für die Programmierung im Reflektionsstil. dir() ist der richtige Startpunkt, wenn Sie in einer interaktiven Shell herumhacken.

+0

'print vars .__ doc__' zeigt an, dass' mit einem Argument gleichbedeutend mit dem Objekt .__ dict__' ist. Was wären die feinen Unterschiede? –

57

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

Geben Sie alle Mitglieder eines Objekts in einer Liste von (Name, Wert) -Paaren sortiert nach Namen zurück. Wenn das optionale Prädikat-Argument angegeben wird, werden nur die Elemente eingeschlossen, für die das Prädikat einen wahren Wert zurückgibt.

>>> [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

Ja, diese Antwort ist großartig; habe dieses Modul vorher noch nie benutzt. getmembers() wird implementiert, indem einfach die Ergebnisse von dir (object), btw. – Nelson

+0

Können Sie erläutern, warum dies besser ist als der Zugriff auf __dict__? Die Python-Dokumentation ist weniger hilfreich, vor allem weil sie normalerweise den Begriff 'Attribute' anstelle von' Mitglieder' verwendet (gibt es einen Unterschied zwischen den beiden?). Sie hätten den Namen in Python 3.0 korrigieren können, um ihn konsistent zu machen. – nikow

+0

Hoppla, gemeint ist "__dict__", tut mir leid. – nikow

8

georg Scholly kürzere Version

print vars(theObject) 
4

Wenn Sie zur Reflexion aller Eigenschaften suchen, die Antworten sind oben groß.

Wenn Sie einfach eine Riesenauswahl an die Schlüssel eines Objekts zu erhalten, verwenden

my_dict.keys()

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

sollte Antwort angenommen werden – danday74

+0

, obwohl es meine Antwort ist, glaube ich nicht, dass es die akzeptierte Antwort sein sollte: die Schlüssel eines Objekts unterscheiden sich von der Eigenschaft einer Objektinstanz einer Klasse. Auf sie wird anders zugegriffen ('obj ['key']' vs. 'obj.property') und die Frage lautete Objekteigenschaften. Ich gebe meine Antwort hier an, weil es eine leichte Verwirrung zwischen den beiden gibt. – MrE

Verwandte Themen