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?
python
reflection
properties
Jader Dias
quelle
quelle
@property
.Antworten:
Beachten Sie, dass es in einigen seltenen Fällen eine
__slots__
Eigenschaft gibt, solche Klassen haben oft keine__dict__
.quelle
__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 passierensetattr()
, 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ünschtefile.ImplementationName
Eigenschaft dynamisch definiert und steht daher oder nicht zur Verfügung .vars()
dir()
Siehe
inspect.getmembers(object[, predicate])
.quelle
attributes
anstelle von verwendet wirdmembers
(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()
Wrapsdir()
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 jedochdir()
absolut ausreichend.dir()
ist der einfache Weg. Siehe hier:Leitfaden zur Python-Selbstbeobachtung
quelle
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 Funktionenvars()
unddir()
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.quelle
print vars.__doc__
zeigt an,With an argument, equivalent to object.__dict__
also was wären die subtilen Unterschiede?georg scholly kürzere version
quelle
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()
quelle
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.
stasis
ist statisch,dyno
dynamisch (vgl. Eigenschaftsdekorator) undclassy
ein Klassenattribut. Wenn wir es einfach tun__dict__
odervars
nur die statische bekommen.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:Die
type
mit einer Eigenschaft dekorierte Methode (ein dynamisches Attribut) gibt den Typ des zurückgegebenen Werts an, nichtmethod
. Um dies zu beweisen, lassen Sie es von json stringifizieren: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.quelle