Python3装饰器及其使用

缺乏、安全感 2022-03-07 08:11 245阅读 0赞

测试运行时间:


  1. import time
  2. start = time.time()
  3. time.sleep(1)
  4. end = time.time()
  5. print('运行时间:', end - start)

改写成函数(修改函数):


  1. # 得到运行时间
  2. def f1():
  3. start = time.time()
  4. sum = 0
  5. for i in range(100000):
  6. sum += i
  7. print(sum)
  8. end = time.time()
  9. print('f1() speed %s' % (end - start))
  10. f1()

写成可以测试其他函数(传入函数):


  1. # 遵守开放封闭原则
  2. # 用于测试函数运行时间 把函数作为参数传入到另一个函数调用执行
  3. def show_time(f): # 一定要注意写成变量形式
  4. start = time.time()
  5. f()
  6. end = time.time()
  7. print(f.__name__, 'speed is %s' % (end - start))
  8. # 调用的时候也要函数名写成变量的样子进行执行
  9. show_time(f1)

不写成其他函数,并且不直接修改原函数实现原函数添加新的功能:就需要装饰器


  1. # 装饰器 为之前的函数添加新的功能 添加显示执行时间的函数
  2. def f2_show_time(f):
  3. def inner():
  4. start = time.time()
  5. f()
  6. end = time.time()
  7. print(f.__name__, 'speed is %s' % (end - start))
  8. return inner # 返回函数地址
  9. # 注意格式 f2_show_time()函数是f1()函数的装饰器,为f1添加新的功能,但是不改变f1函数
  10. f1 = f2_show_time(f1)
  11. f1()

假设,装饰器也早就写好了,想直接给某个函数添加新的功能: @装饰器名


  1. # 如果我们想给f2() 添加新的功能直接
  2. @f2_show_time # 这句就等价于 f2= show_time(f2) 重要
  3. def f2():
  4. print("I want to add showtime function to ", f2.__name__)
  5. time.sleep(2)
  6. f2() #

之前的函数以及装饰器没有传参,如果想进行传参:修改inner()就可


  1. # 带有参数的
  2. # 装饰器 为之前的函数添加新的功能 添加显示执行时间的函数
  3. def f3_show_time(f):
  4. def inner(x, y):
  5. start = time.time()
  6. f(x, y)
  7. end = time.time()
  8. print(f.__name__, 'speed is %s' % (end - start))
  9. return inner # 返回函数地址
  10. # 如果我们想给f3() 添加新的功能直接
  11. @f3_show_time # 这句就等价于 f2= show_time(f2) 重要
  12. def f3(a, b):
  13. print("I want to add showtime function to ", f3.__name__)
  14. print('a+b=', a + b)
  15. time.sleep(2)
  16. f3(8, 9) # hello speed is 2.0124034881591797

要点:

  • 装饰器是双层函数,外层函数参数为函数名
  • 装饰器是双层函数,内层函数的参数,视原函数参数而定。注意:return inner 不带括号。
  • 将装饰器添加到原函数。方式1:原函数=装饰器(原函数) 。方式2:在原函数前 @装饰器。

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python3装饰介绍

          Python中的装饰器(decorator)是一个接受另一个函数作为参数的函数。装饰器通常会修改或增强它接受的函数并返回修改后的函数。这意味着当你调用一个装饰函数时