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() и др.).
- Чрезмерное использование интроспекции может усложнить понимание кода, поэтому её стоит применять там, где важна динамика и универсальность.