Python进阶学习笔记——装饰器(2):带有参数的装饰器

it2022-05-07  11

装饰器

带有参数的装饰器

定义:带有参数的装饰器就是使用装饰器装饰函数的时候可以传入指定参数。语法:@装饰器(参数,...)需求:希望给装饰器传入更多的参数,让装饰器内部使用。办法:由于装饰器函数只能有一个参数,就是被装饰函数的引用,所以实现方式“将装饰器放入一个函数的内部,外部函数接收参数,给装饰器使用”。联想: 在《大头绿衣斗僵尸》中有一个情节,阎王爷虽然清正廉明不收礼,但是判官为了保命把礼物送给了阎王的夫人们(后院起火),拿人手短,最后判官的事情只能不了了之。这就好比,装饰器虽然不能接收额外参数,但是可以把参数传给装饰器的外层函数,这样装饰器相当于间接的接收了参数。 扩展:外部函数被称为装饰器工厂函数,用与接收装饰器要使用的参数,并且创建装饰器对象; import time def get_run_time(flag): """装饰器工厂函数 接收装饰器需要使用参数;创建装饰器对象""" def get_time(func): """统计运行时间的 装饰器函数 只有一个参数-被装饰的函数引用""" def inner(*args, **kwargs): """位置参数 关键字参数k=v""" # 在执行原函数功能前,可以先执行扩展功能 print("函数开始执行") begin = time.time() ret = func(*args, **kwargs) # 将返回值暂存,等合适的时机调用 # 在执行原函数功能后,可以再执行扩展功能 end = time.time() print("函数结束执行") if flag == 0: print("函数花费了%f 秒" % (end - begin)) else: print("函数花费了%d 秒" % int(end - begin)) return ret return inner return get_time # 灵魂函数:f1 = (get_run_tim(1)(f1)) <===> f1 = gettime装饰器(f1) @get_run_time(1) def f1(number): time.sleep(1) print("这是原函数功能开始执行...... %s完成" % number) @get_run_time(0) def f2(): time.sleep(3) print("这是原函数功能开始执行...... 完成") return 1001 f1(100) ret = f2() print(ret) --------------------------------------------- 函数结束执行 函数花费了1 秒 函数开始执行 这是原函数功能开始执行...... 完成 函数结束执行 函数花费了3.0009811001

最新回复(0)