Добавить в корзинуПозвонить
Найти в Дзене

Шпаргалка по декораторам и замыканиям в Python

Продолжим знакомиться с Python. Подписывайтесь на мой канал в Телеграмм, чтобы ничего не пропустить. Замыкание — это функция, которая "запоминает" контекст, в котором она была создана, даже если этот контекст уже не существует. Это позволяет функции получить доступ к переменным из внешней области видимости, даже после завершения выполнения внешней функции. Декоратор — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию (или другую callable сущность). Декораторы позволяют "оборачивать" функции, добавляя к ним дополнительное поведение без изменения их исходного кода. Немного истории: Объяснение: 1. outer_function создает локальную переменную x и возвращает inner_function. 2. При вызове closure(5), внутренняя функция всё ещё "помнит" значение x, переданное в outer_function. Вывод: До вызова функции Привет! После вызова функции Объяснение: 1. Декоратор decorator_function оборачивает функцию say_hello и добавляет дополнительное поведение до и после
Оглавление

Продолжим знакомиться с Python.

Подписывайтесь на мой канал в Телеграмм, чтобы ничего не пропустить.

Замыкание — это функция, которая "запоминает" контекст, в котором она была создана, даже если этот контекст уже не существует. Это позволяет функции получить доступ к переменным из внешней области видимости, даже после завершения выполнения внешней функции.

Декоратор — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию (или другую callable сущность). Декораторы позволяют "оборачивать" функции, добавляя к ним дополнительное поведение без изменения их исходного кода.

Немного истории:

  • Концепция замыканий появилась в функциональных языках программирования, таких как Lisp, ещё в 1960-х годах. В Python они поддерживаются с самого начала, с версии 1.0 (1994 год).
  • В Python декораторы были добавлены относительно поздно, только в версии 2.4 (2004 год).
  • Однако концепция декораторов является общей для многих языков программирования. Например, в Java используются аннотации для схожих целей, а в JavaScript можно реализовать функциональность декораторов через функции высшего порядка.

Замыкания (Closures)

Зачем и когда применять:

  • Замыкания полезны, когда нужно сохранить состояние или данные, которые будут использоваться позже, особенно в функциях обратного вызова (callback), обработчиках событий или при создании фабрик функций.
  • Они позволяют реализовать функциональное программирование и инкапсуляцию данных без необходимости в классах.

Пример замыкания:

-2

Объяснение:

1. outer_function создает локальную переменную x и возвращает inner_function.

2. При вызове closure(5), внутренняя функция всё ещё "помнит" значение x, переданное в outer_function.

Свойства замыканий:

  • В Python функции — это объекты, и они могут захватывать переменные из внешней области видимости.
  • Замыкание необходимо, когда нужно сохранить состояние между вызовами функции.
  • Переменные, захваченные замыканием, иммутабельны (если они не изменяются с помощью ключевого слова nonlocal).

Декораторы (Decorators)

Зачем и когда применять:

  • Декораторы полезны для добавления функциональности к существующим функциям или методам без изменения их исходного кода. Например, для логирования, управления доступом, кеширования, проверки прав доступа и т.д.
  • Они часто применяются в веб-разработке (например, в Django для маршрутизации или авторизации).

Пример простого декоратора:

-3

Вывод:

До вызова функции
Привет!
После вызова функции

Объяснение:

1. Декоратор decorator_function оборачивает функцию say_hello и добавляет дополнительное поведение до и после вызова исходной функции.

2. @decorator_function — это синтаксический сахар, эквивалентный записи: say_hello = decorator_function(say_hello).

Декораторы с аргументами:

Иногда декоратору нужно передать аргументы. Для этого можно написать декоратор, который возвращает другую функцию-декоратор.

-4

Вывод:

Привет!
Привет!
Привет!

Объяснение:

1. repeat возвращает декоратор, который вызывает исходную функцию несколько раз.

2. @repeat(3) оборачивает функцию say_hello, заставляя её выполняться 3 раза.

Декораторы для функций с аргументами:

Если функция, которую вы декорируете, принимает аргументы, обертка (wrapper) должна также принимать такие аргументы.

-5

Вывод:

Вызов с аргументами: (2, 3), {}
5

Несколько декораторов:

Можно применять несколько декораторов к одной функции. Они будут применяться сверху вниз.

-6

Вывод:

Декоратор 1
Декоратор 2
Привет!

Декоратор для классов:

Декораторы можно применять не только к функциям, но и к классам.

-7

Полезные встроенные декораторы

@staticmethod и @classmethod:

  • @staticmethod: Превращает метод класса в обычную функцию, которая не получает доступ к самому экземпляру или классу.
  • @classmethod: Превращает метод в метод класса, который получает класс в качестве первого аргумента.
-8

@property:

Используется для создания геттеров и сеттеров в стиле атрибутов.

-9

Проблемы с декораторами и решение через functools.wraps

Когда вы оборачиваете функцию декоратором, оригинальные метаданные функции (например, её имя или документация) могут потеряться. Для сохранения этих данных рекомендуется использовать декоратор functools.wraps.

-10

Заключение

  • Замыкания позволяют функциям помнить контекст, в котором они были созданы.
  • Декораторы добавляют дополнительное поведение к функциям или классам, не изменяя их исходный код.
  • Декораторы могут быть с аргументами и могут быть вложенными.
  • Используйте functools.wraps, чтобы сохранять метаданные оригинальной функции при декорировании.

Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам

-11