die Namen der Attribute des Objekts, die Namen der Attribute seiner Klasse und rekursiv der Attribute der Basisklassen seiner Klasse.
Das sagt es auch
Die Liste ist nicht notwendigerweise vollständig.
Gibt es eine Möglichkeit die zu bekommen Komplett aufführen? Ich bin immer davon ausgegangen, dass dir eine vollständige Liste zurückgibt, aber anscheinend nicht …
Außerdem: Gibt es eine Möglichkeit, nur Attribute aufzulisten? Oder nur Methoden?
Bearbeiten: Dies ist eigentlich ein Fehler in Python -> angeblich wird er im 3.0-Zweig behoben (und vielleicht auch in 2.6)
verwenden dir() oder das Inspektionsmodul ist im Allgemeinen der richtige Weg, dies zu tun. Hast du benutzt re Modul nur als Beispiel oder wollen Sie ein spezielles Ziel erreichen?
– Benutzer3850
10. Oktober 08 um 12:50 Uhr
Sind Sie sicher, dass das Muster nach der Kompilierung tatsächlich als Daten gespeichert wird? Ich hatte den Eindruck, dass der Sinn des Kompilierens eines Musters darin bestand, die Automaten mit endlichen Zuständen zu erzeugen, die zum Analysieren des gegebenen Musters erforderlich sind.
– Kyle Strand
20. März ’13 um 19:20 Uhr
@hop kann dir nicht von Klassen umgangen werden? Zum Beispiel können sie ihre on machen __dir__()
– ytpillai
11. August 15 um 16:58 Uhr
ytpillai: richtig, aber nur in Python 3. Trotzdem ist die Frage, ob eine solche Klasse unter den “allgemeinen Fall” fallen würde
– Benutzer3850
12. August 15 um 14:17 Uhr
PierreBdR
Für die Komplett Liste von Attributen, die kurze Antwort lautet: nein. Das Problem ist, dass die Attribute tatsächlich als Argumente definiert sind, die von akzeptiert werden getattr eingebaute Funktion. Da kann der Benutzer neu implementieren __getattr__, plötzlich jede Art von Attribut zulässt, gibt es keine generische Möglichkeit, diese Liste zu generieren. Der dir Funktion gibt die Schlüssel in der zurück __dict__ Attribut, dh alle Attribute, auf die zugegriffen werden kann, wenn die __getattr__ Methode wird nicht neu implementiert.
Für die zweite Frage ist es nicht wirklich sinnvoll. Eigentlich sind Methoden aufrufbare Attribute, nicht mehr. Sie könnten jedoch aufrufbare Attribute filtern und mithilfe von inspect Modul bestimmen die Klasse Methoden, Methoden oder Funktionen.
inpect.getmembers(re.compile(pattern)) ergibt auch kein Muster als Member, also verwendet es wahrscheinlich intern dir … Das ist scheiße!
– Bartosz Radaczyński
10. Oktober 08 um 12:28 Uhr
Ich könnte auch Callable verwenden, um zu überprüfen, ob es sich um Methoden handelt, aber darum geht es nicht … Der Punkt ist, dass ich dir nicht vertrauen kann, dass es nicht einmal die Liste der Attribute zurückgibt, die tatsächlich öffentlich sichtbar sind …
– Bartosz Radaczyński
10. Oktober 08 um 12:32 Uhr
inspect soll “mindestens so” vertrauenswürdig sein wie dir(). Andererseits ist re ein sehr kompliziertes Modul
– Benutzer3850
10. Oktober 08 um 12:57 Uhr
Was definieren Sie unter „öffentlich sichtbar“? Wenn Sie “aufrufbar” meinen, dann ist das aus dem angegebenen Grund eine verlorene Sache. Andernfalls gibt ‘dir’ immer die Liste der Attribute zurück, auf die mit der Standardimplementierung von getattr zugegriffen werden kann.
– PierreBdR
10. Oktober 08 um 16:31 Uhr
dir(my_class) gibt etwas anderes zurück als my_class.__dict__.keys(). erstere gibt auch die Methoden der Klasse like aus drin und Dok
– JuanPi
19. März 13 um 13:06 Uhr
Deshalb das Neue __dir__() Methode wurde in Python 2.6 hinzugefügt
Ich bekomme diesen Fehler: >> dir__(pyrenderdoc) Traceback (letzter Aufruf zuletzt): Datei ““, Zeile 1, in NameError: name ‘__dir‘ ist nicht definiert
– Mona Dschalal
30. Dezember 16 um 1:28 Uhr
__dir__() ist eine Methode für ein Objekt, keine Funktion – bitte lesen Sie die Links in der Antwort und Dies
– Moe
3. Januar 17 um 14:06 Uhr
Einzeiler zum Drucken aller Attribute und ihrer Werte: pprint({k:getattr(ojb,k) for k in obj.__dir__()})
– Tschechisch
26. April 18 um 08:42 Uhr
ジョージ
Hier eine praktische Ergänzung zu den Antworten von PierreBdR und Moe:
Für Python >= 2.6 und Klassen neuen Stils, dir() scheint zu reichen.
Für Klassen im alten Stil, wir können zumindest was tun Standardmodul unterstützt die Tab-Vervollständigung: zusätzlich zu dir(), suchen __class__, und dann für seine zu gehen __bases__:
# code borrowed from the rlcompleter module
# tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) n[GCC 4.4.3]' )
# or: from rlcompleter import get_class_members
def get_class_members(klass):
ret = dir(klass)
if hasattr(klass,'__bases__'):
for base in klass.__bases__:
ret = ret + get_class_members(base)
return ret
def uniq( seq ):
""" the 'set()' way ( use dict when there's no set ) """
return list(set(seq))
def get_object_attrs( obj ):
# code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() )
ret = dir( obj )
## if "__builtins__" in ret:
## ret.remove("__builtins__")
if hasattr( obj, '__class__'):
ret.append('__class__')
ret.extend( get_class_members(obj.__class__) )
ret = uniq( ret )
return ret
(Testcode und Ausgabe wurden der Kürze halber gelöscht, aber im Grunde scheinen wir für Objekte im neuen Stil die gleichen Ergebnisse zu haben get_object_attrs() wie für dir(), und für Klassen im alten Stil die Hauptergänzung zum dir() Ausgabe scheinen die zu sein __class__ Attribut.)
Chiron
Nur zur Ergänzung:
dir() ist der die meisten mächtiges/grundlegendes Werkzeug. (Am meisten empfohlen)
Andere Lösungen als dir() lediglich bereitstellen ihr Weg des Umgangs die Ausgabe von dir().
Unabhängig davon, ob Sie Attribute der 2. Ebene auflisten oder nicht, ist es wichtig, das Sieben selbst durchzuführen, da Sie manchmal interne Variablen mit führenden Unterstrichen aussieben möchten __, aber manchmal braucht man das durchaus __doc__ doc-string.
__dir__() und dir() gibt identische Inhalte zurück.
__dict__ und dir() sind anders. __dict__ gibt unvollständigen Inhalt zurück.
WICHTIG: __dir__() kann manchmal vom Autor für welchen Zweck auch immer mit einer Funktion, einem Wert oder Typ überschrieben werden.
Hier ist ein Beispiel:
\...\torchfun.py in traverse(self, mod, search_attributes)
445 if prefix in traversed_mod_names:
446 continue
447 names = dir(m)
448 for name in names:
449 obj = getattr(m,name)
TypeError: Deskriptor __dir__ von 'object' Objekt benötigt ein Argument
Der Autor von PyTorch hat die __dir__() Methode zu etwas, das ein Argument erfordert. Diese Modifikation macht dir() Scheitern.
Wenn Sie möchten zuverlässig Schema, um alle Attribute eines Objekts zu durchlaufen, denken Sie daran, dass jeder pythonische Standard kann überschrieben werden und gilt möglicherweise nicht, und jede Konvention kann unzuverlässig sein.
mluc
So mache ich es, nützlich für einfache benutzerdefinierte Objekte, denen Sie ständig Attribute hinzufügen:
Bei einem Objekt, das mit erstellt wurde obj = type("Obj",(object,),{}), oder einfach:
class Obj: pass
obj = Obj()
Fügen Sie einige Attribute hinzu:
obj.name="gary"
obj.age = 32
dann, um ein Wörterbuch nur mit den benutzerdefinierten Attributen zu erhalten:
{key: value for key, value in obj.__dict__.items() if not key.startswith("__")}
# {'name': 'gary', 'age': 32}
Liste aller Attribute in Python 3.x: {Schlüssel: Wert für Schlüssel, Wert in obj.__dict__.items() falls nicht key.startswith(“__”)}[‘_declared_fields’].Schlüssel()
– über_c_level
9. Juni 20 um 11:32 Uhr
Liste aller Attribute in Python 3.x: {Schlüssel: Wert für Schlüssel, Wert in obj.__dict__.items() falls nicht key.startswith(“__”)}[‘_declared_fields’].Schlüssel()
– über_c_level
9. Juni 20 um 11:32 Uhr
.
6191100cookie-checkWie erhalte ich eine vollständige Liste der Methoden und Attribute von Objekten? [duplicate]yes
verwenden
dir()
oder das Inspektionsmodul ist im Allgemeinen der richtige Weg, dies zu tun. Hast du benutztre
Modul nur als Beispiel oder wollen Sie ein spezielles Ziel erreichen?– Benutzer3850
10. Oktober 08 um 12:50 Uhr
Sind Sie sicher, dass das Muster nach der Kompilierung tatsächlich als Daten gespeichert wird? Ich hatte den Eindruck, dass der Sinn des Kompilierens eines Musters darin bestand, die Automaten mit endlichen Zuständen zu erzeugen, die zum Analysieren des gegebenen Musters erforderlich sind.
– Kyle Strand
20. März ’13 um 19:20 Uhr
@hop kann dir nicht von Klassen umgangen werden? Zum Beispiel können sie ihre on machen
__dir__()
– ytpillai
11. August 15 um 16:58 Uhr
ytpillai: richtig, aber nur in Python 3. Trotzdem ist die Frage, ob eine solche Klasse unter den “allgemeinen Fall” fallen würde
– Benutzer3850
12. August 15 um 14:17 Uhr