Что выведет этот код?


def decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
        return wrapper

@decorator
def hello():
    print("Hello!")

hello()

Этот код демонстрирует работу декоратора в Python.

Декоратор decorator принимает функцию func в качестве аргумента и возвращает новую функцию wrapper.

wrapper выполняет следующий код:

  1. Выводит "Before function call"
  2. Вызывает оригинальную функцию func (в данном случае hello)
  3. Выводит "After function call"

Синтаксис @decorator перед определением функции hello является синтаксическим сахаром, эквивалентным hello = decorator(hello). Он применяет декоратор к функции hello.

При вызове hello() будет выполнен код функции wrapper, который сначала выведет "Before function call", затем "Hello!", и, наконец, "After function call".


Разбор задачи:

Данный код демонстрирует использование декоратора в Python. Давайте разберем, что происходит:

  1. Определение декоратора decorator:

    Функция decorator принимает другую функцию (func) в качестве аргумента и возвращает новую функцию (wrapper). Это основа декоратора.

  2. Внутренняя функция wrapper:

    Функция wrapper содержит логику, которая будет выполняться до и после вызова декорируемой функции. В данном случае, она выводит "Before function call", затем вызывает исходную функцию func(), и после этого выводит "After function call".

  3. Декорирование функции hello:

    @decorator над определением функции hello эквивалентно записи hello = decorator(hello). Это означает, что функция hello "заменяется" на функцию wrapper, возвращенную декоратором.

  4. Вызов hello():

    Когда вызывается hello(), на самом деле вызывается wrapper(). wrapper() выполняет свою логику (выводит сообщения "Before..." и "After...") и вызывает исходную функцию hello(), которая выводит "Hello!".

Результат выполнения:

При выполнении кода будет выведено следующее:

    
Before function call
Hello!
After function call
    
  

Важные концепции:

  • Декораторы: Позволяют добавлять новую функциональность к существующим функциям без изменения их исходного кода.
  • Функции первого класса: В Python функции являются объектами первого класса, что означает, что их можно передавать в качестве аргументов другим функциям, возвращать из функций и присваивать переменным.
  • Замыкания: Функция wrapper имеет доступ к переменным из внешней области видимости (в данном случае, к func), даже после того, как внешняя функция decorator завершила свое выполнение. Это пример замыкания.
0