装饰器的真正用途是什么?

时间:2019-07-03 04:25:09

标签: python python-3.x python-3.7 python-decorators

我正在尝试了解装饰器在现实世界中的使用。

来到装饰器上,我们都知道它是用来装饰功能的。     这意味着我们可以在现有功能上添加一些额外的功能,但是可以通过使用其他简单功能来完成,也可以调用一个功能,该功能将调用另一个功能。那么为什么我们需要使用装饰器。

我已经尝试制作两个程序

  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 个答案:

答案 0 :(得分: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