IC # wir machen es durch Reflexion. In Javascript ist es einfach wie:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Wie geht das in Python?
@property
.
IC # wir machen es durch Reflexion. In Javascript ist es einfach wie:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Wie geht das in Python?
@property
.
Antworten:
for property, value in vars(theObject).iteritems():
print property, ": ", value
Beachten Sie, dass es in einigen seltenen Fällen eine __slots__
Eigenschaft gibt, solche Klassen haben oft keine __dict__
.
__setattr__()
. Das Festlegen von Werten direkt im Wörterbuch umgeht den Setter des Objekts (und / oder dessen Eltern). In Python ist es durchaus üblich, dass während der Attributeinstellung (z. B. Hygiene) mehr Dinge im Hintergrund passieren setattr()
, als Sie sich vorstellen können. Dadurch wird sichergestellt, dass Sie nichts verpassen oder gezwungen sind, diese explizit selbst zu behandeln.
vars()
Gibt nur statische Elemente zurück (dh Objektattribute und Methoden, die bei diesem Objekt registriert sind __dict__
). Es spielt keine Rück dynamischer Elemente (dh Objektattribute und Methoden dynamisch durch dieses Objekt definierte __getattr__()
Methode oder ähnliche Magie). Höchstwahrscheinlich wird Ihre gewünschte file.ImplementationName
Eigenschaft dynamisch definiert und steht daher oder nicht zur Verfügung . vars()
dir()
Siehe inspect.getmembers(object[, predicate])
.
Gibt alle Mitglieder eines Objekts in einer Liste von (Name, Wert) Paaren zurück, die nach Namen sortiert sind. Wenn das optionale Prädikatargument angegeben wird, werden nur Mitglieder 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']
>>>
attributes
anstelle von verwendet wird members
(gibt es einen Unterschied zwischen den beiden?). Sie hätten den Namen in Python 3.0 korrigieren können, um ihn konsistent zu machen.
__dict__
, tut mir leid.
inspect.getmembers()
Wraps dir()
mit den (meist vernachlässigbaren) Nebeneffekten von (A) einschließlich dynamischer Klassenattribute und Metaklassenattribute und (B) Ausschluss von Mitgliedern, die nicht mit dem übergebenen Prädikat übereinstimmen. Gähnen, richtig? inspect.getmembers()
ist für Bibliotheken von Drittanbietern geeignet, die generisch alle möglichen Objekttypen unterstützen. Für Standardanwendungsfälle ist dies jedoch dir()
absolut ausreichend.
dir()
ist der einfache Weg. Siehe hier:
dir()
danke.
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, sich aber nicht in befinden __dict__
. Es gibt auch die eingebauten Funktionen vars()
und dir()
die auf subtile Weise anders sind. Und __slots__
kann __dict__
in einigen ungewöhnlichen Klassen ersetzen .
Objekte sind in Python kompliziert. __dict__
ist der richtige Ausgangspunkt für die Reflexionsprogrammierung. dir()
ist der Ausgangspunkt, wenn Sie in einer interaktiven Shell herumhacken.
print vars.__doc__
zeigt an, With an argument, equivalent to object.__dict__
also was wären die subtilen Unterschiede?
georg scholly kürzere version
print vars(theObject)
Wenn Sie alle Eigenschaften widerspiegeln möchten, sind die obigen Antworten großartig.
Wenn Sie nur nach den Schlüsseln eines Wörterbuchs suchen (das sich von einem 'Objekt' in Python unterscheidet), verwenden Sie
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
vs. obj.property
) aufgerufen und die Frage betraf Objekteigenschaften. Ich habe hier meine Antwort gestellt, weil zwischen den beiden eine leichte Verwechslung besteht.
Dies wird durch die anderen Antworten vollständig abgedeckt, aber ich werde es explizit machen. Ein Objekt kann Klassenattribute sowie statische und dynamische Instanzattribute aufweisen.
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
ist statisch, dyno
dynamisch (vgl. Eigenschaftsdekorator) und classy
ein Klassenattribut. Wenn wir es einfach tun __dict__
oder vars
nur die statische bekommen.
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
Wenn wir also wollen, bekommen die anderen __dict__
alles (und mehr). Dies umfasst magische Methoden und Attribute sowie normal gebundene Methoden. Vermeiden wir also Folgendes:
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}
Die type
mit einer Eigenschaft dekorierte Methode (ein dynamisches Attribut) gibt den Typ des zurückgegebenen Werts an, nicht method
. Um dies zu beweisen, lassen Sie es von json stringifizieren:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
Wäre es eine Methode gewesen, wäre sie abgestürzt.
TL; DR. Versuchen Sie, extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
alle drei zu fordern , aber weder Methoden noch Magie.