Skip to content

🥕 Narzędzia introspekcji

Introspekcja pozwala na dynamiczne badanie obiektów, ich struktur oraz cech w czasie działania programu.


__class__

Pozwala sprawdzić klasę, do której należy dany obiekt.

class Zwierze:
    pass

class Pies(Zwierze):
    pass

reksio = Pies()
print(reksio.__class__)        # <class '__main__.Pies'>
print(reksio.__class__.__name__)  # Pies

__dict__

Słownik przechowujący wszystkie atrybuty instancji. Pozwala dynamicznie uzyskać do nich dostęp, modyfikować je lub iterować po nich.

class Samochod:
    def __init__(self, marka, model, rok):
        self.marka = marka
        self.model = model
        self.rok = rok

moj_samochod = Samochod("Toyota", "Corolla", 2020)
print(moj_samochod.__dict__)  # {'marka': 'Toyota', 'model': 'Corolla', 'rok': 2020}

isinstance() i issubclass()

isinstance(obiekt, klasa) sprawdza, czy obiekt jest instancją danej klasy lub którejkolwiek klasy nadrzędnej.
issubclass(klasa_pochodna, klasa_bazowa) sprawdza relację między klasami.

class Zwierze:
    pass

class Pies(Zwierze):
    pass

reksio = Pies()

print(isinstance(reksio, Pies))     # True
print(isinstance(reksio, Zwierze))  # True  - bo Pies dziedziczy po Zwierze
print(isinstance(reksio, str))      # False

print(issubclass(Pies, Zwierze))    # True
print(issubclass(Zwierze, Pies))    # False

Tip

Preferuj isinstance() zamiast type(x) == Klasa - ta pierwsza uwzględnia dziedziczenie.


hasattr(), getattr(), setattr()

Pozwalają dynamicznie sprawdzać i operować na atrybutach obiektów po nazwie (jako string).

class Samochod:
    def __init__(self, marka, rok):
        self.marka = marka
        self.rok = rok

auto = Samochod("Toyota", 2020)

# Sprawdzenie czy atrybut istnieje
print(hasattr(auto, "marka"))   # True
print(hasattr(auto, "kolor"))   # False

# Odczyt atrybutu po nazwie
print(getattr(auto, "marka"))          # Toyota
print(getattr(auto, "kolor", "brak"))  # brak  - wartość domyślna gdy atrybut nie istnieje

# Ustawienie atrybutu po nazwie
setattr(auto, "kolor", "czerwony")
print(auto.kolor)  # czerwony

Szczególnie przydatne gdy nazwa atrybutu jest znana dopiero w czasie działania programu (np. pochodzi z konfiguracji lub danych wejściowych).


dir()

Zwraca posortowaną listę wszystkich atrybutów i metod dostępnych dla danego obiektu - łącznie z odziedziczonymi i dunder methods.

class Pies:
    def __init__(self, imie):
        self.imie = imie

    def szczekaj(self):
        return "Hau!"

reksio = Pies("Reksio")
print(dir(reksio))
# ['__class__', '__delattr__', ..., 'imie', 'szczekaj']

Przydatne do eksploracji nieznanego obiektu - zobaczysz co oferuje bez czytania dokumentacji.