惊落一身雪 发表于 2024-8-15 19:27:44

Python底子:装饰器

装饰器介绍

Python装饰器是一种特别类型的函数,它可以修改或增强其他函数的功能,而无需更改原始函数的源代码。
装饰器本质上是一个接收函数作为参数的函数,它返回一个新的函数或者修改过的原函数,通常用于插入日志、性能测试、权限校验、缓存、事务处置处罚等场景。
题目引入

我现在有一个数字求和函数:
def number_sum(a, b):
    sum = a + b
    print(sum)
    return sum

number_sum(4,5)
题目:给这个函数添加上性能测试的功能(即检测函数运行所耗的时间)但是不允许更改原函数的代码?
题目分析

检测步伐运行时间,一样平常是这样的:
import time
def jiance()
        start = time.time()
    函数体                     
    end = time.time()
        print("所耗时间:", end - start,"秒")
解决题目

没学装饰器和语法糖之前,你是这么写得:
```python                           
import time                           

def number_sum(a, b):                           
    sum = a + b                           
    print(sum)                           
    return sum                           

def time_js(a, b):                           
    start = time.time()                           
    r = number_sum(a, b)                           
    time.sleep(2)            #因为太快了!为了能看到效果,这里睡觉2秒                     
    print("结果为:",r)                           
    end = time.time()                           
    print("所耗时间:", end - start,"秒")                           

time_js(5,6)                           
运行结果:
结果为: 11
所耗时间: 2.001185894012451 秒
优点:满足要求
缺点:不能复用
当你学了装饰器和语法糖之后是这样写得:
import time

def jiance(jc_time):
    def wrapper(a,b):
      start = time.time()
      result = jc_time(a,b)
      time.sleep(2)    #因为太快了!为了能看到效果,这里睡觉2秒
      end = time.time()
      print("所耗时间:", end - start,"秒")
      return result
    return wrapper

@jiance
def number_sum(a, b):
    sum = a + b
    print(sum)
    return sum

ss = number_sum(4,5)
运行结果:
9
所耗时间: 2.011695146560669 秒
优点:满足要求
缺点:只能在相同两个参数数量的情况下复用
继承改进
我们将变量换成*args
import time

def jiance(jc_time):
    def wrapper(*args):
      start = time.time()
      result = jc_time(*args)
      time.sleep(2)
      end = time.time()
      print("所耗时间:", end - start, "秒")
      return result

    return wrapper


@jiance
def number_sum2(a, b):
    sum = a + b
    print(sum)
    return sum


@jiance
def number_sum3(a, b, c):
    sum = a + b + c
    print(sum)
    return sum


ss = number_sum2(4, 5)
ss = number_sum3(4, 5, 6)
运行结果:
9
所耗时间: 2.005794048309326 秒

15
所耗时间: 2.0033328533172607 秒
优点:满足要求,可以复用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Python底子:装饰器