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)