Skip to content

Introspection

Определение#

Интроспекция (Introspection) — это способность программы исследовать тип, структуру и свойства объектов прямо во время её выполнения (runtime).

Зачем нужна#

Introspection позволяет писать более гибкий и универсальный код. Она незаменима при создании отладчиков, фреймворков (например, для автоматического маппинга данных в БД) или когда нужно проверить, поддерживает ли неизвестный объект определённый метод перед его вызовом.

Интроспекция vs Рефлексия#

Эти понятия часто путают, но между ними есть ключевое различие в возможностях воздействия на объект.

Понятие Суть Пример действий
Интроспекция Изучение объекта «Кто ты?», «Какие у тебя методы?», «Какой у тебя ID?»
Рефлексия Изменение объекта «Вызови этот метод», «Создай новое поле», «Поменяй значение»

Основные инструменты#

Python предоставляет мощный набор встроенных функций для интроспекции любого объекта.

  • type(obj) — возвращает тип объекта.

  • dir(obj) — возвращает список всех атрибутов и методов объекта.

  • isinstance(obj, class) — проверяет, является ли объект экземпляром класса или его наследником.

  • hasattr(obj, name) — проверяет наличие атрибута с указанным именем.

  • id(obj) — возвращает уникальный идентификатор (адрес в памяти) объекта.

  • callable(obj) — проверяет, можно ли вызвать этот объект (функция это или нет).

Продвинутая интроспекция#

Для глубокого анализа живых объектов используется встроенный модуль inspect. Он позволяет получать исходный код функций, список аргументов, информацию о стеке вызовов и детальную структуру классов.

    import inspect

    def my_func(a, b=10):
        pass

    # Получаем сигнатуру функции (её аргументы)
    print(inspect.signature(my_func))  # (a, b=10)

Ключевые мысли#

  • В Python «всё является объектом», поэтому интроспекция работает абсолютно для всего: от чисел до целых модулей.
  • Интроспекция — это только чтение данных об объекте; для модификации используется рефлексия (через setattr, globals() и др.).
  • Чрезмерное использование интроспекции может усложнить понимание кода, поэтому её стоит применять там, где важна динамика и универсальность.