Этот вопрос, пожалуй, встречается на каждом собеседовании. Вообще декораторы — тема большая и как-нибудь обязательно найду хороший материал, чтобы раскрыть её шире. Но а пока давайте базово разберёмся в этом вопросе.
Если вкратце, декоратор позволяет добавить новую функциональность к существующей функции. Это делается так. Функция передаётся декоратору, а он выполняет и существующий и дополнительный код. Для примера напишем декоратор, который записывает в журнал вызовы другой функции.
Напишем функцию декоратора
В качестве аргумента он принимает функцию
func. Декоратор определяет функцию log_function_called, которая вызывает func() и выполняет код print(f'{func} called.'). А затем возвращает определенную им функцию:def logging(func): def log_function_called(): print(f'{func} called.') func()return log_function_calledНапишем другие функции, к которым позже добавим декоратор:
def my_name(): print('chris')def friends_name(): print('naruto')my_name() #=> chrisfriends_name() #=> narutoТеперь добавим декоратор к эти двум функциям:
@loggingdef my_name(): print('chris')@loggingdef friends_name(): print('naruto')my_name()#=> <function my_name at 0x10fca5a60> called.#=> chrisfriends_name()#=> <function friends_name at 0x10fca5f28> called.#=> narutoТеперь легко добавить ведение журнала в любую функцию, которую мы пишем. Достаточно написать перед ней
@logging.#собеседование