Каково реальное использование декораторов? - PullRequest
0 голосов
/ 03 июля 2019

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

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

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

  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])
    

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

1 Ответ

1 голос
/ 03 июля 2019

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

Решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...