Die Python-Funktion hasattr(obj, name) prüft, ob ein Objekt ein bestimmtes Attribut besitzt — gibt True oder False back. Sie ist damit ein kompakter Check, der intern getattr() mit try/except AttributeError aufruft. Typische Einsatzgebiete: Duck-Typing, optionale Konfigurationen, Plugin-Systeme.

Einleitung

hasattr() ist die kompakteste Möglichkeit, in Python zu prüfen, ob ein Objekt ein bestimmtes Attribut besitzt. Intern ruft die Funktion einfach getattr(obj, name) in einem try/except-Block auf — fängt jeden auftretenden AttributeError und liefert False.

In der Praxis wird hasattr() für Duck-Typing eingesetzt („verhält sich das Objekt wie ein Iterable?"), für optionale Konfigurationen und in Plugin-Systemen, in denen Klassen optional bestimmte Methoden implementieren.

Wichtig zu wissen: Da hasattr() jeden AttributeError schluckt, kann es bei fehlerhaft implementierten Properties oder __getattr__-Methoden ein falsches False liefern. In solchen Fällen ist ein expliziter try/except mit dem Zugriff oft die genauere Wahl.

Syntax

Python Syntax
hasattr(object, name)
Parameter
object

Beliebiges Python-Objekt.

name

Name des Attributs als String.

Rückgabewert

True, wenn getattr(obj, name) ohne AttributeError ein Ergebnis liefert. Sonst False.

Beispiele

Standard-Check

Python Beispiel
class User:
    def __init__(self):
        self.name = "Michael"

u = User()
print(hasattr(u, "name"))
print(hasattr(u, "email"))
Output
True
False

Methoden prüfen (Duck-Typing)

Python Beispiel
def describe(obj):
    if hasattr(obj, "__len__"):
        return f"Länge: {len(obj)}"
    return "Keine Länge ermittelbar"

print(describe([1, 2, 3]))
print(describe(42))
Output
Länge: 3
Keine Länge ermittelbar

Optionale Konfiguration

Python Beispiel
class Config:
    debug = True

cfg = Config()
if hasattr(cfg, "debug") and cfg.debug:
    print("Debug-Modus aktiv")
Output
Debug-Modus aktiv

Praktische Beispiele

Plugin-Hooks dynamisch aufrufen

Python Beispiel
class Plugin:
    name = "Beispiel-Plugin"
    def on_start(self):
        print(f"{self.name} gestartet")
    # Kein on_stop definiert

for hook in ("on_start", "on_stop"):
    plugin = Plugin()
    if hasattr(plugin, hook):
        getattr(plugin, hook)()
    else:
        print(f"Hook '{hook}' nicht implementiert")
Output
Beispiel-Plugin gestartet
Hook 'on_stop' nicht implementiert

Iterables erkennen ohne Try/Except

Python Beispiel
def is_iterable(obj):
    return hasattr(obj, "__iter__")

for x in [[1, 2], "hallo", 42, {"a": 1}, None]:
    print(f"{x!r:15}{is_iterable(x)}")
Output
[1, 2]          → True
'hallo'         → True
42              → False
{'a': 1}        → True
None            → False

Settings mit optionalen Feldern absichern

Python Beispiel
class Settings:
    host = "localhost"
    port = 8080
    # ssl ist optional und nicht immer gesetzt

s = Settings()
scheme = "https" if hasattr(s, "ssl") and s.ssl else "http"
print(f"{scheme}://{s.host}:{s.port}")
Output
http://localhost:8080

Praktische Hinweise

  • hasattr schluckt jede Exception im Attribut-Lookup — auch solche aus __getattr__. Bei Properties, die intern Fehler werfen, kann das täuschen.
  • EAFP statt LBYL: Pythonisch ist oft try: x.attr; except AttributeError: ... statt if hasattr(x, "attr"): x.attr. Bei einmaligem Zugriff EAFP wählen, bei mehrfacher Prüfung hasattr().
  • getattr(obj, name, default) mit Default ist häufig die elegantere Alternative zu „if hasattr then getattr".
  • Verwandte Funktionen: getattr(), setattr(), delattr().
/ Weiter

Zurück zu Builtin Functions

Zur Übersicht