isinstance w Python to wbudowana funkcja służąca do sprawdzania, czy obiekt jest instancją określonego typu lub klasy, co jest kluczowe w dynamicznie typowanych językach, takich jak Python. Daje programiście kontrolę nad typami danych, pozwala na bezpieczniejsze operacje, lepszą obsługę błędów i czytelniejszy kod.
Podstawy isinstance: składnia i zastosowanie
- Składnia –
isinstance(obj, classinfo)
obj– obiekt, którego typ sprawdzamy,classinfo– klasa, typ lub krotka klas/typów,- Zwracana wartość –
Truejeśli obiekt jest instancją podanego typu lub jednej z klas w krotce,Falsew przeciwnym przypadku.
Przykłady użycia
- Prosta kontrola typu –
a = 5
print(isinstance(a, int)) # True
print(isinstance(a, str)) # False
- Sprawdzanie kilku typów jednocześnie –
b = [10, 20, 37]
print(isinstance(b, (int, list, str))) # True, bo b jest listą
- Sprawdzanie typów własnych klas oraz dziedziczenia –
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(isinstance(dog, Dog)) # True
print(isinstance(dog, Animal)) # True, bo Dog dziedziczy po Animal
- Sprawdzanie typów z modułów wbudowanych –
text = "Hello"
print(isinstance(text, str)) # True
Zastosowania praktyczne
isinstance używamy, gdy:
- Piszesz funkcje obsługujące różne typy danych (np. liczby całkowite, listy, słowniki),
- Walidujesz argumenty wejściowe w klasach/funkcjach przed dalszą obróbką,
- Chcesz obsłużyć dziedziczenie – uznasz klasy potomne za pasujące do klasy bazowej.
Przykład walidacji argumentów:
def add_numbers(a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a + b
raise TypeError("Argumenty muszą być liczbami.")
Isinstance vs. type – różnice i dobre praktyki
type(obj) is typ– sprawdza dokładny typ;isinstance(obj, typ)– uwzględnia dziedziczenie, więc typ pochodny zostanie uznany za pasujący do klasy bazowej.
Kiedy stosować?
- Preferuj
isinstance– kod bardziej elastyczny i zgodny z zasadą polimorfizmu.
Sprawdzanie wielu typów naraz
Możesz sprawdzić, czy obiekt pasuje do którejkolwiek klasy z krotki typów:
value = "tekst"
print(isinstance(value, (int, float, str))) # True, bo value jest str
Obsługa typów własnych, dziedziczenie i polimorfizm
isinstance obsługuje klasy wbudowane i własne klasy oraz rozpoznaje relacje dziedziczenia:
- Obiekt klasy pochodnej zwróci
Trueprzy sprawdzaniu typu klasy bazowej, - Pozwala stosować polimorfizm, np. przy przetwarzaniu kolekcji obiektów różnych klas dziedziczących po jednej bazowej.
Pułapki i błędy użycia
- Niepoprawne przekazanie klasy –
Drugim argumentem musi być klasa, typ lub krotka klas/typów; przekazanie np. stringa wywoła błądTypeError; - Zbyt rygorystyczne sprawdzanie dokładnego typu –
Użycietype(obj) is typzamiastisinstancezablokuje dziedziczenie i polimorfizm.
Podsumowanie dobrych praktyk
- Używaj isinstance zawsze, gdy chcesz obsłużyć typ wraz z dziedziczeniem i polimorfizmem;
- Stosuj tuple typów w sprawdzaniach “wielotypowych”;
- Wyłapuj błędne typy już na etapie walidacji danych wejściowych (np. w funkcjach, metodach, API).
Najczęściej stosowane typy w Pythonie
- int – liczby całkowite;
- float – liczby zmiennoprzecinkowe;
- str – tekst;
- list – listy;
- tuple – krotki;
- dict – słowniki.
Przykład:
for item in [3, 5.7, "abc", [1,2], (3,4), {"a":1}]:
print(isinstance(item, (int, float, str, list, tuple, dict))) # Zwraca True dla każdego typu z tupli
isinstance to nieodzowne narzędzie każdego programisty Pythona – zwiększa czytelność kodu, zapobiega błędom i ułatwia pracę z różnorodnymi typami danych.