Назад к вопросам
Middle
63
questionbank

Что такое рефлексия в контексте Python?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Основные возможности:

  • Получение информации о типе/объекте:
    • type() - получить тип объекта.
    • isinstance() - проверить, является ли объект экземпляром класса или подклассом.
    • issubclass() - проверить, является ли один класс подклассом другого.
  • Доступ к атрибутам:
    • getattr(obj, name[, default]) - получить значение атрибута.
    • setattr(obj, name, value) - установить значение атрибута.
    • hasattr(obj, name) - проверить наличие атрибута.
    • delattr(obj, name) - удалить атрибут.
  • Доступ к документации:
    • help() - интерактивная справка.
    • __doc__ - доступ к docstring объекта.
  • Выполнение кода:
    • eval(expression[, globals[, locals]]) - выполняет строку как выражение Python.
    • exec(object[, globals[, locals]]) - выполняет строку или объект кода.
  • Исследование пространства имен:
    • dir([object]) - список имен в текущем пространстве имен или атрибутов объекта.
    • globals() - словарь глобальных переменных текущего модуля.
    • locals() - словарь локальных переменных текущей функции или модуля.

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

class MyClass:
    def __init__(self, value):
        self.value = value

    def my_method(self):
        return self.value * 2

obj = MyClass(10)

# Получение типа
print(type(obj)) # <class '__main__.MyClass'>

# Проверка на экземпляр
print(isinstance(obj, MyClass)) # True

# Получение атрибута по имени
attr_name = "value"
print(getattr(obj, attr_name)) # 10

# Вызов метода по имени
method_name = "my_method"
method = getattr(obj, method_name)
print(method()) # 20

# Установка нового атрибута
setattr(obj, "new_attr", "hello")
print(obj.new_attr) # hello

# Выполнение кода из строки
code_string = "print('Executing code from string')"
exec(code_string) # Executing code from string

Таблица основных функций рефлексии:

Функция Описание
type() Получить тип объекта
isinstance() Проверить экземпляр
issubclass() Проверить подкласс
getattr() Получить атрибут
setattr() Установить атрибут
hasattr() Проверить наличие атрибута
delattr() Удалить атрибут
help() Интерактивная справка
__doc__ Доступ к docstring
eval() Выполнить строку как выражение
exec() Выполнить строку или объект кода
dir() Список имен в пространстве имен или атрибутов
globals() Словарь глобальных переменных
locals() Словарь локальных переменных

Используется в метапрограммировании, отладке, сериализации/десериализации, плагинной архитектуре. Следует использовать осторожно, так как может усложнить понимание кода и потенциально создать проблемы безопасности (eval/exec).