Какова реальная польза от декораторов?

Я пытаюсь понять реальное использование декораторов.

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

Я уже пытался сделать две программы

  1. с декораторами

    def decor_result(result_as_argument):
     def new_function(marks):
         for i in marks:
                if i>= 75:
                    print("Congrats distiction",i)   
           else:
               result_as_argument(marks)
       return new_function
    
    @decor_result
    def result(marks):
       for i in marks:
           if i >= 35:
               pass
            else:
                print("Fail")
            break
        else:
            print("Pass")   
    
    result([79,65,55,78,12])
    
  2. без декораторов

    def result_distict(marks):
        for i in marks:
            if i>= 75:
                print("Congrats distiction",i)   
        else:
            result(marks)
    def result(marks):
        for i in marks:
            if i >= 35:
                pass
            else:
                print("Fail")
                break
        else:
            print("Pass")
    result_distict([79,65,55,78,12])
    result([79,65,55,78,12])
    

Делая это, я узнал, что без использования декораторов это более упрощено, и мы можем использовать любую функцию, какую захотим, а с помощью декораторов мы не можем использовать старую функцию, так зачем и где использовать декораторы?

СУХОЙ.
Stephen Rauch 03.07.2019 06:26

Чтобы расширить, совсем чуть-чуть; речь идет о шаблонах. Когда вы хотите сделать одно и то же расширение для нескольких функций, декоратор пишется только один раз, а затем применяется снова и снова, в то время как более наивный подход требует, чтобы каждая функция была обернута одним и тем же кодом, т. е. вам нужно повторяться.

JohanL 03.07.2019 06:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем примере делать декоратор не нужно. Вы хотите использовать декоратор, когда пытаетесь реализовать определенное поведение для набора функций. Например, допустим, вы пытаетесь отобразить время выполнения всех функций в вашем скрипте.

Решение 1) Вы добавляете небольшой фрагмент кода везде, чтобы отобразить его:

from time import time

def f1():
    t0 = time()
    # f1 body
    print("Execution time of f1: {}".format(time()-t0))

def f2():
    t0 = time()
    # f2 body
    print("Execution time of f2: {}".format(time()-t0))

Как видите, код очень повторяющийся. Если вы хотите что-то изменить в этом общем поведении, вам нужно изменить все функции. Вот где декоратор полезен.

2) Использование декораторов:

def timer(func):
    def wrapper(*args,**kwargs):
        t0 = time()
        res = func(*args,**kwargs)
        duration = time()-t0

        print("Execution time of {}: {} s".format(func.__name__, duration))
        return res

    return wrapper

@timer
def f1():
    # body of f1

@timer
def f2():
    # body of f2

Другие вопросы по теме