Пример ответа
Коротко: Декоратор в Python — это функция, которая принимает другую функцию и расширяет её поведение без изменения её кода, что я использовал для добавления логирования, кэширования или проверки прав в веб-приложениях.
Ключевые идеи:
- Декоратор оборачивает целевую функцию, добавляя функциональность до или после её вызова
- Используется через синтаксис @decorator_name, что делает код чище и модульным
- В моём опыте, декораторы упрощают повторное использование кода для аспектов, таких как аутентификация или мониторинг
Пример: Например, декоратор для логирования времени выполнения функции: def log_time(func): def wrapper(*args, **kwargs): start = time.time(); result = func(*args, **kwargs); print(f"Время выполнения: {time.time() - start} сек"); return result; return wrapper
Пример декоратора для кэширования результатов функции с использованием словаря
python
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
print("Возвращаю результат из кэша")
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
@cache_decorator
def expensive_computation(n):
print(f"Вычисляю для {n}")
return n * n
# Использование
print(expensive_computation(5)) # Вычисляет и кэширует
print(expensive_computation(5)) # Возвращает из кэша
Вопросы для интервьюера:
- Как вы реализуете декоратор с параметрами в Python? — Создаю функцию, возвращающую декоратор: def retry(max_attempts): def decorator(func): def wrapper(*args, **kwargs): for i in range(max_attempts): try: return func(*args, **kwargs); except Exception: continue; raise Exception("Все попытки провалились"); return wrapper; return decorator
- Какие встроенные декораторы в Python вы часто используете? — @staticmethod, @classmethod для методов классов и @property для геттеров/сеттеров, а также @functools.lru_cache для мемоизации
Практический совет (на неделю):
- Попробуйте написать декоратор для логирования вызовов функций в своём проекте, чтобы отслеживать поведение
- Изучите библиотеку functools для готовых декораторов, таких как wraps, чтобы сохранять метаданные функций
Golang Backend
Общий
34%
Следующий: Какие у тебя зарплатные ожидания
Предыдущий: Расскажи про свой опыт