Die Python-Funktion isinstance(obj, classinfo) prüft, ob ein Objekt eine Instanz einer Klasse oder einer ihrer Subklassen ist. Im Gegensatz zu type(obj) is Cls berücksichtigt isinstance() die Vererbungshierarchie und akzeptiert auch ein Tupel von Typen als zweites Argument. Das macht sie zur idiomatischen Wahl für Typprüfungen in Python.
Einleitung
isinstance() ist Pythons Standard-Werkzeug für explizite Typprüfungen. Sie unterscheidet sich in zwei wichtigen Punkten von type(obj) == Cls:
- Vererbung wird respektiert: Eine Instanz einer Subklasse zählt auch als Instanz der Oberklasse.
isinstance(True, int)→True, weilboolvoninterbt. - Mehrere Typen auf einmal:
isinstance(x, (int, float))prüft, obxzu mindestens einem der Typen passt.
Außerdem versteht isinstance() Abstract Base Classes (ABCs) aus dem collections.abc-Modul. So lässt sich z. B. mit isinstance(obj, Iterable) abstrakt prüfen, ob ein Objekt ein Iterable ist — egal ob list, tuple, dict oder ein eigener Typ mit __iter__.
In modernem Python wird Typprüfung oft durch Type Hints und Tools wie mypy ersetzt. Zur Laufzeit bleibt isinstance() aber unverzichtbar — vor allem in API-Boundaries und bei Polymorphismus-Entscheidungen.
Syntax
isinstance(object, classinfo)object Beliebiges Python-Objekt.
classinfo Eine Klasse, ein Typ — oder ein Tupel davon. Seit Python 3.10 auch eine Union mit | (z. B. int | float).
Rückgabewert
True, wenn das Objekt eine Instanz der angegebenen Klasse oder einer Subklasse ist. Sonst False.
Beispiele
Standard-Typprüfung
print(isinstance(42, int))
print(isinstance("hallo", str))
print(isinstance([1, 2, 3], list))
print(isinstance(3.14, int))True
True
True
FalseTupel von Typen
def is_number(x):
return isinstance(x, (int, float, complex))
print(is_number(42))
print(is_number(3.14))
print(is_number("42"))True
True
FalseVererbung
class Animal: pass
class Dog(Animal): pass
bello = Dog()
print(isinstance(bello, Dog))
print(isinstance(bello, Animal)) # erbt von Animal
print(isinstance(True, int)) # bool erbt von int!True
True
TrueABCs aus collections.abc
from collections.abc import Iterable, Mapping
print(isinstance([1, 2], Iterable))
print(isinstance("text", Iterable))
print(isinstance({"a": 1}, Mapping))
print(isinstance(42, Iterable))True
True
True
FalsePraktische Beispiele
Polymorphes Verhalten in Funktionen
def normalize(x):
if isinstance(x, str):
return x.strip().lower()
if isinstance(x, (list, tuple)):
return [normalize(item) for item in x]
if isinstance(x, dict):
return {k: normalize(v) for k, v in x.items()}
return x
print(normalize({"name": " ALICE ", "tags": ["A", " B "]})){'name': 'alice', 'tags': ['a', 'b']}Bool von int unterscheiden (Edge-Case)
# bool erbt von int — manchmal will man das explizit ausschließen
def is_real_number(x):
return isinstance(x, (int, float)) and not isinstance(x, bool)
print(is_real_number(42))
print(is_real_number(True)) # False
print(is_real_number(3.14))True
False
TrueUnion-Syntax (Python 3.10+)
# Statt Tupel auch mit | als Union schreibbar
def is_text_or_bytes(x):
return isinstance(x, str | bytes)
print(is_text_or_bytes("hi"))
print(is_text_or_bytes(b"hi"))
print(is_text_or_bytes(42))True
True
FalsePraktische Hinweise
- Bevorzuge
isinstance()übertype(x) == Cls— letzteres ignoriert Vererbung und ist meist falsch. - Duck-Typing zuerst: In Python ist „kann es Methode X?" oft die bessere Frage als „ist es Typ Y?".
try/exceptoderhasattr()sind häufig idiomatischer. - ABCs aus
collections.abcermöglichen abstrakte Checks (Iterable,Mapping,Sized,Sequence, ...). - Performance:
isinstance()ist sehr schnell, aber im Hot-Path noch schneller mittype()(ohne Vererbungs-Check). - Verwandte Funktion:
issubclass()prüft analog für Klassen statt Instanzen.