595 Stimmen

Alle Objektattribute in Python abrufen?

Gibt es eine Möglichkeit, die todo Attribute/Methoden/Felder/etc. eines Objekts in Python?

vars() es schließen was ich will, aber es funktioniert nicht, es sei denn, ein Objekt hat eine __dict__ was nicht immer der Fall ist (z. B. nicht für eine list , a dict , usw.).

783voto

mouad Punkte 63071

Verwenden Sie die integrierte Funktion dir() .

173voto

Slipstream Punkte 11219

Ich benutze __dict__ y dir(<instance>)

Beispiel :

class MyObj(object):
  def __init__(self):
    self.name = 'Chuck Norris'
    self.phone = '+6661'

obj = MyObj()
print(obj.__dict__)
print(dir(obj))

# Output:  
# obj.__dict__ --> {'phone': '+6661', 'name': 'Chuck Norris'}
#
# dir(obj)     --> ['__class__', '__delattr__', '__dict__', '__doc__',
#               '__format__', '__getattribute__', '__hash__', 
#               '__init__', '__module__', '__new__', '__reduce__', 
#               '__reduce_ex__', '__repr__', '__setattr__', 
#               '__sizeof__', '__str__', '__subclasshook__', 
#               '__weakref__', 'name', 'phone']

120voto

Eli Collins Punkte 7985

Was Sie wahrscheinlich wollen, ist dir() .

Der Haken an der Sache ist, dass Klassen in der Lage sind, die spezielle __dir__ Methode, die dazu führt, dass dir() zurückgeben, was immer die Klasse will (obwohl sie aufgefordert werden, eine genaue Liste zurückzugeben, wird dies nicht erzwungen). Darüber hinaus können einige Objekte dynamische Attribute durch Überschreiben von __getattr__ können RPC-Proxy-Objekte oder Instanzen von C-Extension-Klassen sein. Wenn Ihr Objekt eines dieser Beispiele ist, haben sie möglicherweise keine __dict__ oder in der Lage sein, eine umfassende Liste von Attributen zu liefern über __dir__ Viele dieser Objekte können so viele dynamische Attribute haben, dass sie nicht wirklich erkannt werden. was hat, bis Sie versuchen, darauf zuzugreifen.

Auf kurze Sicht, wenn dir() nicht ausreicht, können Sie eine Funktion schreiben, die die folgenden Schritte durchläuft __dict__ für ein Objekt, dann __dict__ für alle Klassen in obj.__class__.__mro__ Dies funktioniert allerdings nur für normale Python-Objekte. Auf lange Sicht müssen Sie vielleicht Enten-Typisierung + Annahmen verwenden - wenn es wie eine Ente aussieht, kreuzen Sie Ihre Finger und hoffen, dass es eine hat .feathers .

91voto

Jason Angel Punkte 1960

Sie können verwenden dir(your_object) um die Attribute zu erhalten und getattr(your_object, your_object_attr) um die Werte zu erhalten

Verwendung:

for att in dir(your_object):
    print (att, getattr(your_object,att))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X