|
| 1 | +## Определение |
| 2 | + |
| 3 | +!!! info "" |
| 4 | + **Интроспекция** (Introspection) — это способность программы исследовать тип, структуру и свойства объектов прямо во |
| 5 | + время её выполнения (runtime). |
| 6 | + |
| 7 | +## Зачем нужна |
| 8 | + |
| 9 | +<span class="badge">Introspection</span> позволяет писать более гибкий и универсальный код. Она незаменима при создании |
| 10 | +отладчиков, фреймворков (например, для автоматического маппинга данных в БД) или когда нужно проверить, поддерживает ли |
| 11 | +неизвестный объект определённый метод перед его вызовом. |
| 12 | + |
| 13 | +## Интроспекция vs Рефлексия |
| 14 | + |
| 15 | +Эти понятия часто путают, но между ними есть ключевое различие в возможностях воздействия на объект. |
| 16 | + |
| 17 | +| Понятие | Суть | Пример действий | |
| 18 | +|---------------|-------------------|--------------------------------------------------------------| |
| 19 | +| Интроспекция | Изучение объекта | «Кто ты?», «Какие у тебя методы?», «Какой у тебя ID?» | |
| 20 | +| Рефлексия | Изменение объекта | «Вызови этот метод», «Создай новое поле», «Поменяй значение» | |
| 21 | + |
| 22 | +## Основные инструменты |
| 23 | +Python предоставляет мощный набор встроенных функций для интроспекции любого объекта. |
| 24 | + |
| 25 | +- <span class="badge">type(obj)</span> — возвращает тип объекта. |
| 26 | + |
| 27 | +- <span class="badge">dir(obj)</span> — возвращает список всех атрибутов и методов объекта. |
| 28 | + |
| 29 | +- <span class="badge">isinstance(obj, class)</span> — проверяет, является ли объект экземпляром класса или его наследником. |
| 30 | + |
| 31 | +- <span class="badge">hasattr(obj, name)</span> — проверяет наличие атрибута с указанным именем. |
| 32 | + |
| 33 | +- <span class="badge">id(obj)</span> — возвращает уникальный идентификатор (адрес в памяти) объекта. |
| 34 | + |
| 35 | +- <span class="badge">callable(obj)</span> — проверяет, можно ли вызвать этот объект (функция это или нет). |
| 36 | + |
| 37 | + |
| 38 | + |
| 39 | +## Продвинутая интроспекция |
| 40 | + |
| 41 | +Для глубокого анализа живых объектов используется встроенный модуль <span class="badge">inspect</span>. |
| 42 | +Он позволяет получать исходный код функций, список аргументов, информацию о стеке вызовов и детальную структуру классов. |
| 43 | + |
| 44 | +```python |
| 45 | + import inspect |
| 46 | + |
| 47 | + def my_func(a, b=10): |
| 48 | + pass |
| 49 | + |
| 50 | + # Получаем сигнатуру функции (её аргументы) |
| 51 | + print(inspect.signature(my_func)) # (a, b=10) |
| 52 | +``` |
| 53 | + |
| 54 | +## Ключевые мысли |
| 55 | +- В Python «всё является объектом», поэтому интроспекция работает абсолютно для всего: от чисел до целых модулей. |
| 56 | +- Интроспекция — это только чтение данных об объекте; для модификации используется рефлексия (через setattr, globals() и др.). |
| 57 | +- Чрезмерное использование интроспекции может усложнить понимание кода, поэтому её стоит применять там, где важна динамика и универсальность. |
0 commit comments