Что такое интроспекция в 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__: Специальный атрибут, содержащий словарь атрибутов объекта (для большинства объектов).

Ответ 18+ 🔞

Да ты посмотри, что творится-то! Вот сидит этот ваш Python, такой весь из себя динамический, и позволяет тебе, сука, прямо во время работы программы шарить по карманам у объектов, как последнему распиздую! Это ж интроспекция называется, блядь. Не просто посмотреть, а и потрогать, и даже изменить можно, если руки из нужного места растут.

Ну и нахуй это надо, спросишь?

  • Дебажить и логировать: Понять, что за хуйня у тебя в переменной плавает и почему она не работает.
  • Туда-сюда превращать: Из объекта в JSON, из JSON в объект — всё на лету, блядь, как фокусник.
  • Гибкие штуки делать: Фреймворки всякие, где по названиям методов само всё прикручивается. Магия, ёпта!
  • Метапрограммирование: Это когда программа про себя думает и сама себя меняет. Пиздец, да? Ум за разум заходит.

Смотри, как это выглядит, на простых примерах:

# 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 — проверяем, а есть ли у него, блядь, атрибут 'value'?
print(getattr(obj, 'value')) # 10 — а ну-ка, дай-ка сюда его значение!
setattr(obj, 'new_attr', 'test') # А теперь, наглец, получай новый атрибут прямо в runtime!
print(obj.new_attr)       # test — работает, сука!

# 3. Весь модуль наизнанку вывернуть
import math
print(dir(math))          # Все функции, константы — всё, что математики туда напихали.

# 4. Заглянуть в личный дневник объекта
print(obj.__dict__)       # {'value': 10, 'new_attr': 'test'} — вот он, весь его скелет в шкафу.

Чем, блядь, ковырять будем?

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

Вот так-то. Сила, конечно, овердохуищная, но и накосячить можно так, что мало не покажется. Так что с умом, блядь, с умом!