装饰器有啥用,装饰器可以在不改变原有函数的前提下,对代码增加功能,实现代码解耦。要学装饰器,必须要搞懂闭包,二者是相辅相成的。
看上面这个图,我在调用test1(12)的时候发生了什么?@set_func ,等价于test1 = set_func(test1),由此可知我在调用set_func的时候,把test1函数当做参数传递进去了,又因为set_func函数是一个闭包,里面函数call_func,用到了set_func的变量,那么此时,我在call_func里面调用func(num),就相当于我调用了test1(),在来看set_func的返回值是返回了call_func在内存中的地址,我再去调用test1(),就相当于我调用了call_func,
代码运行时间的装饰器:
import time def run_time(func): def end_time(*args): start_time = time.time() func(*args) stop_time = time.time() print('代码运行时间为:{}'.format(stop_time - start_time)) return end_time
有返回值的装饰器:
def set_func(func): def call_func(*args,**kwargs): print('---这是权限验证1---') return func(*args,**kwargs) return call_func @set_func #等价于test1 = set_func(test1) def test1(num,*args,**kwargs): print('---test1---{0}'.format(num)) print('---test1---{0}'.format(args)) print('---test1---{0}'.format(kwargs)) return 'ok','200' test1(12)