Назад к вопросам
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).