Python / dir() / Attributnamen eines Objekts erkunden

Pythons dir(object) liefert eine Liste von Attributnamen als Zeichenketten. Methoden oder Attributwerte werden weder selbst zurückgegeben noch ausgeführt. Die Namen sind sortiert, doch Objekte können die Liste anpassen; sie ist kein garantiert vollständiges Verzeichnis aller zugänglichen Attribute.

Das Ergebnis enthält Namen statt Methoden

Attribute sind Daten oder Verhalten eines Objekts, Methoden dessen aufrufbares Verhalten. Bei Zeichenketten ist upper ein Name und text.upper() der tatsächliche Aufruf. Die offizielle dir()-Referenz beschreibt den Schwerpunkt auf bequemer interaktiver Erkundung.

Die vollständigen Beispiele benötigen nur Python 3. Speichern Sie den Code als UTF-8 in dir_example.py und starten Sie python dir_example.py oder gegebenenfalls python3. Spätere Beispiele können den Dateiinhalt ersetzen und unabhängig laufen.

text = "hello"
names = dir(text)
print(type(names).__name__)
print(all(isinstance(name, str) for name in names))
print("upper" in names)
print(names == sorted(names))
print(text.upper())

Erwartete Ausgabe:

list
True
True
True
HELLO

Alle Elemente sind Zeichenketten. Das Finden von upper verändert keinen Text; erst der letzte explizite Methodenaufruf tut dies. Vollständige Attributlisten können zwischen Python-Versionen variieren, weshalb das Beispiel gezielt einen relevanten Namen prüft.

Module und Listen ebenso erkunden

Module enthalten Namen für Funktionen, Konstanten und weitere Objekte. Nach dem Finden von sqrt in dir(math) erfolgt der Aufruf über math.sqrt(). Auch append verändert die Liste erst beim tatsächlichen Aufruf.

import math

print("sqrt" in dir(math))
print(math.sqrt(9))
items = []
print("append" in dir(items))
items.append("a")
print(items)
True
3.0
True
['a']

Ein Name erklärt keine Argumente oder Rückgabewerte. Lesen Sie help(math.sqrt) oder die offizielle Moduldokumentation. Führende Unterstriche können Konventionen anzeigen, verhindern externen Zugriff aber nicht als Sicherheitsgrenze.

dir() und vars() untersuchen Unterschiedliches

dir(instance) kann neben direkt gespeicherten Namen auch solche aus Klasse und Vererbung enthalten. vars(object) liefert dagegen das __dict__ des Objekts. Das hilft bei direkt gespeicherten Attributen und Werten, doch nicht jedes Objekt besitzt dieses Dictionary.

class User:
    role = "reader"

    def __init__(self, name):
        self.name = name

    def label(self):
        return f"{self.role}:{self.name}"

user = User("Ada")
print([name for name in dir(user) if name in ("name", "role", "label")])
print(vars(user))
print(user.label())
['label', 'name', 'role']
{'name': 'Ada'}
reader:Ada

name liegt auf der Instanz, role und label kommen aus der Klasse. Daher unterscheiden sich die Ergebnisse. vars(user) ist hier das tatsächliche Attribut-Dictionary, keine Kopie: Verändern Sie es nicht beiläufig beim Erkunden. Ohne Dictionary, etwa bei manchen Klassen mit __slots__, kann vars() zu TypeError führen.

Ohne Argument den aktuellen Namensraum untersuchen

dir() ohne Argument liefert Namen des aktuellen lokalen Namensraums und nicht sämtliche eingebauten Funktionen oder installierten Pakete. Im frischen eigenständigen Skript erscheint das definierte marker, die eingebaute Funktion abs dagegen nicht unmittelbar.

marker = 7
print("marker" in dir())
print("abs" in dir())
True
False

Eine interaktive Sitzung oder ein Notebook kann Namen aus früheren Ausführungen enthalten. Prüfen Sie daher Aufrufort und zurückgebliebene Variablen.

Eigene __dir__()-Methoden und dynamische Attribute

Objekte können die Liste mit __dir__() anpassen und über __getattr__() Attribute dynamisch anbieten. Ein fehlender Name kann somit trotzdem zugänglich sein, während ein angezeigter Name beim Zugriff fehlschlägt.

class Dynamic:
    def __getattr__(self, name):
        if name == "answer":
            return 42
        raise AttributeError(name)

    def __dir__(self):
        return ["visible"]

item = Dynamic()
print(dir(item))
print("answer" in dir(item))
print(getattr(item, "answer"))
print(hasattr(item, "visible"))
['visible']
False
42
False

Das Objekt listet nur visible, stellt aber tatsächlich answer bereit. Verwenden Sie dir() für Erkundung und Vervollständigung und prüfen Sie benötigtes Verhalten anhand der Dokumentation. getattr() und hasattr() können Zugriffscode ausführen; auch dir() kann eigene Methoden aufrufen. Setzen Sie deshalb nicht automatisch Nebenwirkungsfreiheit voraus.