Что такое интроспекция в Python?

Ответ

Интроспекция в Python — это возможность программы исследовать тип, свойства, методы и другие характеристики объекта во время выполнения. Это позволяет динамически получать информацию об объектах и даже модифицировать их, что является мощным инструментом для создания гибких и адаптивных систем.

Почему это полезно:

  • Отладка и логирование: Получение информации о состоянии объектов и вызовах функций.
  • Сериализация/десериализация: Динамическое преобразование объектов в другие форматы (JSON, YAML) и обратно.
  • Создание гибких API и фреймворков: Автоматическая генерация документации, маршрутизации или валидации на основе метаданных объектов.
  • Метапрограммирование: Динамическое создание или изменение кода.

Примеры использования:

# 1. Проверка типа объекта
x = 42
print(type(x))          # <class 'int'>
print(isinstance(x, int)) # True

# 2. Получение атрибутов объекта
class MyClass:
    def __init__(self, value):
        self.value = value
    def greet(self):
        return "Hello"

obj = MyClass(10)
print(dir(obj))           # Список всех атрибутов и методов
print(hasattr(obj, 'value')) # True
print(getattr(obj, 'value')) # 10
setattr(obj, 'new_attr', 'test') # Динамическое добавление атрибута
print(obj.new_attr)       # test

# 3. Интроспекция модуля
import math
print(dir(math))          # Все функции, переменные и классы модуля math

# 4. Доступ к словарю атрибутов
print(obj.__dict__)       # {'value': 10, 'new_attr': 'test'}

Основные инструменты интроспекции в Python:

  • type(), isinstance(): Для проверки типа объекта.
  • dir(): Возвращает список атрибутов и методов объекта.
  • hasattr(), getattr(), setattr(), delattr(): Для проверки наличия, получения, установки и удаления атрибутов по имени.
  • Модуль inspect: Предоставляет более мощные средства для получения информации о функциях, классах, модулях и фреймах стека.
  • __dict__: Специальный атрибут, содержащий словарь атрибутов объекта (для большинства объектов).