Концепции объектно-ориентированного программирования очевидны повсюду. И декораторы не исключение.

Говоря о декораторах в языке программирования Python, они используются для добавления дополнительных функций (задач) к функциям. Без изменения исходного кода функции.

Предположим, у меня уже есть функция с именем «cook_chicken ()», которая говорит мне приготовить курицу.

def cook_chicken():
    print('Cook Chicken')

Но теперь я хочу выполнить (реализовать) «две дополнительные задачи». Во-первых, я хочу приготовить курицу в тандыре, а во-вторых, на гарнир, курицу, приготовленную в тандыре, с корриандром (листьями).

Итак, теперь я вставляю (принудительно) код «двух дополнительных задач» (приготовление курицы в тандыре и украшение ее корриандром) в функции 'cook_chicken ()'. Ответ - «Нет».

Потому что, что, если я хочу написать другую функцию (которая говорит мне приготовить что-то еще), и эта другая функция снова включает эти «две дополнительные задачи» (приготовление чего-либо в тандыре и украшение готового блюда корриандром). Мне снова придется написать код «двух дополнительных задач» в этой другой функции. Этот статический негибкий подход приводит к повторению кода и злоупотреблению ресурсами, что свидетельствует о неправильной практике проектирования.

Кроме того, что, если функция 'cook_chicken ()' является устаревшим кодом (или частью устаревшего кода), тогда вы не захотите нарушать код функции 'cook_chicken ()'. Потому что даже если функция «cook_chicken ()» может выглядеть здесь незначительно по размеру. Унаследованный код реальных программных проектов состоит из тысяч строк. А нарушение устаревшего кода - это глупый шаг и открытое приглашение к ошибкам.

Также принцип проектирования (в программировании) гласит: «Класс или функция должны быть открыты для расширения, но не для модификации».

Это означает, что вы хотите добавить новую функцию (или задачу, если на то пошло) в функцию (или класс). Вы не должны изменять старый устаревший код, который уже существует, вы должны динамически расширять устаревший код.

Поэтому должен быть способ реализовать код «двух дополнительных задач» (приготовление цыпленка в тандыре и украшение его корриандром) динамичным и гибким образом.

Вот здесь-то и пригодятся декораторы Python. Потребуются два (вложенных) декоратора, один будет выполнять задачу по приготовлению в тандыре, а другой поможет гарнировать, блюда (готовые изделия) с корриандром (листьями).

Декоратор prepare_indigridents () украсит курицу корриандром. Декоратор Cooking_on_tandoori () поможет приготовить курицу на тандыре.

Заключение. Что делать, если я хочу использовать cook_mutton () на тандыре. И украсьте мой cook_egg_curry () кориандром. Мне не нужно вставлять код этих задач в функции cook_mutton () и cook_egg_curry (). Имея эти декораторы уже в нашем кармане, мы можем легко использовать их. Без необходимости писать код для задачи тандыра и кориандра. Такой подход делает наш дизайн гибким, динамичным и отказоустойчивым.