装饰器
定义:本质是函数.(装饰其他函数)就是为其他函数添加附加功能
原则:1.不能修改被装饰的函数的源代码
2.不能修改被装饰的函数的调用方式
理解装饰器前提条件:
1.函数即"变量"
2.高阶函数
a.把一个函数名当做实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
b.返回值中包含函数名(不修改函数的调用方式)
3.嵌套函数
1 import time 2 3 ################################### 高阶函数 ################################################################ 4 5 ''' 6 高阶函数 7 ''' 8 #普通函数 9 def foo(): 10 #阻塞两秒 11 time.sleep(2) 12 print("this is foo") 13 #高阶函数 14 def bar(func): 15 start_time = time.time() 16 func() 17 end_time = time.time() 18 print("this is func time %s"%(end_time - start_time)) 19 return func 20 #初始调用foo函数的方式 21 # foo() 22 #经过高阶函数调用foo函数的方式 23 foo = bar(foo) 24 foo() 25 26 ################################### 嵌套函数 ################################################################ 27 28 ''' 29 嵌套函数 30 ''' 31 def bar(): 32 start_time = time.time() 33 def foo(): 34 # 阻塞两秒 35 time.sleep(2) 36 print("this is foo") 37 #调用普通函数 38 foo() 39 end_time = time.time() 40 print("this is func time %s" % (end_time - start_time)) 41 42 #调用嵌套函数 43 bar() 44 45 ################################### 简易版装饰器 ################################################################ 46 47 ''' 48 高阶函数 + 嵌套函数 => 装饰器 49 ''' 50 #简易版装饰器---函数不可传入参数 51 def bar(func): 52 def inner(): 53 start_time = time.time() 54 func() 55 end_time = time.time() 56 print("this is func time %s" % (end_time - start_time)) 57 return inner 58 59 #普通函数 60 @bar 61 def foo(): 62 # 阻塞两秒 63 time.sleep(2) 64 print("this is foo") 65 66 #普通调用方式 67 foo() 68 69 ################################### 升级版装饰器 ################################################################ 70 71 #升级版装饰器---函数可以传入参数 72 def bar(func): 73 def inner(*args,**kwargs): 74 start_time = time.time() 75 func(*args,**kwargs) 76 end_time = time.time() 77 print("this is func time %s" % (end_time - start_time)) 78 return inner 79 80 #普通函数 81 @bar 82 def foo(name,age): 83 # 阻塞两秒 84 time.sleep(2) 85 print(" %s this is foo %s"%(name,age)) 86 87 @bar 88 def deco(): 89 # 阻塞两秒 90 time.sleep(2) 91 print(" this is deco ") 92 93 #普通调用方式 94 deco() 95 foo('zhangsan',22) 96 97 ################################### 高级版装饰器 ################################################################ 98 99 #高级版装饰器---装饰器与函数都可以传入参数,函数装饰内容可以根据装饰器参数做判断 100 #应用场景---在做用户验证时可以使用不同的验证手段,如本地验证,数据库验证,网络验证 101 def decorator(bath_type): 102 def bar(func): 103 def inner(*args,**kwargs): 104 if bath_type == 'fooname': 105 start_time = time.time() 106 func(*args,**kwargs) 107 end_time = time.time() 108 print("this is fooname time %s" % (end_time - start_time)) 109 elif bath_type == 'deconame': 110 start_time = time.time() 111 func(*args, **kwargs) 112 end_time = time.time() 113 print("this is deconame time %s" % (end_time - start_time)) 114 return inner 115 return bar 116 117 #普通函数 118 @decorator(bath_type='fooname') 119 def foo(name,age): 120 # 阻塞两秒 121 time.sleep(2) 122 print(" %s this is foo %s"%(name,age)) 123 124 @decorator(bath_type='deconame') 125 def deco(): 126 # 阻塞两秒 127 time.sleep(2) 128 print(" this is deco ") 129 130 #普通调用方式 131 deco() 132 foo('zhangsan',22)