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
hasattr(object, name)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
class User:
def __init__(self):
self.name = "Michael"
u = User()
print(hasattr(u, "name"))
print(hasattr(u, "email"))True
FalseMethoden prüfen (Duck-Typing)
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))Länge: 3
Keine Länge ermittelbarOptionale Konfiguration
class Config:
debug = True
cfg = Config()
if hasattr(cfg, "debug") and cfg.debug:
print("Debug-Modus aktiv")Debug-Modus aktivPraktische Beispiele
Plugin-Hooks dynamisch aufrufen
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")Beispiel-Plugin gestartet
Hook 'on_stop' nicht implementiertIterables erkennen ohne Try/Except
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)}")[1, 2] → True
'hallo' → True
42 → False
{'a': 1} → True
None → FalseSettings mit optionalen Feldern absichern
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}")http://localhost:8080Praktische Hinweise
hasattrschluckt 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: ...stattif hasattr(x, "attr"): x.attr. Bei einmaligem Zugriff EAFP wählen, bei mehrfacher Prüfunghasattr(). getattr(obj, name, default)mit Default ist häufig die elegantere Alternative zu „if hasattrthengetattr".- Verwandte Funktionen:
getattr(),setattr(),delattr().