装饰器
1 # 概念:本身就是一个闭包 2 # 本质:就是一个返回函数的高阶函数。 3 4 5 def func1(): 6 print(123) 7 def func2(): 8 print(234) 9 # 在函数内部可以调用另一个函数,必须保证这个函数在调用 10 # 之前必须声明过 11 func1() 12 func2() 13 14 15 print("-----------------------------") 16 # 在函数内部声明及调用另一个函数 17 def func3(): 18 print(1111) 19 def func4(): 20 print(2222) 21 func4() 22 23 func3() 24 25 # 什么是闭包:把一个函数作为参数,返回一个代替版的函数。 26 # 闭包:一个返回函数的函数 27 print('*******************************') 28 # 最简单的闭包格式 29 def closer(): 30 print("我是closerFunc") 31 def inner(): 32 print("我是InnerFunc") 33 # 调用函数 34 # inner() 35 # 把inner这个函数作为closer的返回值 36 return inner 37 res = closer() # res === inner res==inner函数 38 res() # ==== inner() 39 # 调用时简写 40 closer()() # closer() ==== inner 41 42 43 # 细节注意 44 def closer(): 45 print("我是closerFunc") 46 def inner(): 47 print("我是InnerFunc") 48 # 将inner的返回值作为closer的返回值返回 49 return inner() 50 res = closer() 51 print(res) 52 53 # 1、最简单的装饰器 54 # 把一个函数作为参数,返回一个代替版的函数。 55 def outer(func): 56 print("---1---") 57 def inner(): 58 print("---2---") 59 func() 60 return inner 61 def testFunc(): 62 print("我是testFunc") 63 print('---------------------------------------------') 64 res = outer(testFunc) # res ==== inner # func = testFunc 65 res() # ===inner() 66 # 在执行inner这个函数时,执行了 func() 67 # func这个形参对应实参为testFunc 68 # 也就间接执行了testFunc() 69 70 # 2、复杂一点的装饰器 71 def outerFunc1(func): 72 def inner(num): 73 # 如果在内部函数执行的函数有参数,可以将通用的边界检测内容, 74 # 放到装饰器中。 75 if num > 200: 76 num = 200 77 elif num <= 0: 78 num= 1 79 func(num) # func === getAge 80 return inner 81 def getAge(age): 82 print("age==", age) 83 res = outerFunc1(getAge) # res === inner 84 res(12) 85 res(300) 86 res(-20) 87 88 def getHeight(height): 89 print("height==",height) 90 res2 = outerFunc1(getHeight) 91 res2(50) 92 res2(300) 93 res2(-12) 94 ''' 95 结论:通过装饰器的方式,会使我们的代码变得更加简洁: 96 将检测条件的逻辑放到一个相对独立的方法中, 97 通过装饰器的包装应用到我们需要的地方。如果我们将检测条件放 98 到原本的函数中,也可以达到相同的目的,但不可置否的是, 99 使用装饰器的方式会使我们以最少的代码量达到我们的目的。 100 ''' 101 # 3、使用@将装饰器应用到函数中 102 # python2.4之后支持@符号 103 def decoratorFunc(func): 104 def inner(num): 105 print("-----inner----") 106 if num < 0: 107 num = 0 108 func(num) 109 return inner 110 print('*********************10:00***************************') 111 @decoratorFunc 112 def getAge(age): # getAge ==== decoratorFunc(getAge) === inner 113 print("age==",age) 114 115 @decoratorFunc 116 def getHeight(height): 117 print("height==",height) 118 # 执行函数 119 # decoratorFunc(getAge)(100) 120 getAge(200) 121 getAge(-200) 122 # decoratorFunc(getHeight)(-200) 123 getHeight(100) 124 getHeight(-10) 125 126 127 # 4、通用的装饰器 128 def deFunc(func): 129 def inner(*args, **kwargs): 130 print(args, kwargs) 131 # if len(args) > 0: 132 # if isinstance(args[0], int): 133 # pass 134 # else: 135 # if len(args[0]) == 0: 136 # print("输入的内容不能为空") 137 if kwargs.get("age") != None: 138 if kwargs["age"] < 0: 139 kwargs["age"] = 0 140 func(*args, **kwargs) 141 return inner 142 @deFunc 143 def getName(name): 144 print(name) 145 @deFunc 146 def getInfo(idNum, name, age): 147 print(idNum, name, age) 148 149 getName("11") 150 getInfo(idNum="12", name="lucy", age=-13)