装饰器

  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)

 

posted @ 2019-07-29 19:32  巨菜的小鸟  阅读(113)  评论(0编辑  收藏  举报