day24

一、装饰器介绍

  1 """
  2 1、什么是装饰器
  3     装饰器是一个用来为被装饰者添加功能的工具
  4 
  5     被装饰者:函数
  6     装饰器:可以用函数实现装饰器这种工具
  7 
  8 
  9 
 10 2、为何要用装饰器
 11     为了在不修改被装饰器对象源代码以及调用方式的前提下
 12     为被装饰对象添加上新功能
 13 
 14 3、如何用装饰器
 15 
 16 """
 17 # 被装饰对象
 18 # import time
 19 #
 20 # def index(x):
 21 #     print('welcome to index page %s' % x)
 22 #     time.sleep(3)
 23 #
 24 # index(111)
 25 
 26 
 27 # # 方案一:修改了源代码
 28 # import time
 29 #
 30 # def index(x):
 31 #     start = time.time()
 32 #     print('welcome to index page %s' % x)
 33 #     time.sleep(3)
 34 #     stop = time.time()
 35 #     print(stop - start)
 36 #
 37 # index(111)
 38 
 39 # # 方案二:没有修改被装饰对象的源代码与调用方式,但是有代码冗余问题
 40 # import time
 41 #
 42 # def index(x):
 43 #     print('welcome to index page %s' % x)
 44 #     time.sleep(3)
 45 #
 46 # start = time.time()
 47 # index(111)
 48 # stop = time.time()
 49 # print(stop - start)
 50 #
 51 #
 52 # start = time.time()
 53 # index(111)
 54 # stop = time.time()
 55 # print(stop - start)
 56 #
 57 #
 58 # start = time.time()
 59 # index(111)
 60 # stop = time.time()
 61 # print(stop - start)
 62 
 63 
 64 # # 方案三:wrapper函数需要外部传入参数
 65 # import time
 66 #
 67 # def index(x):
 68 #     print('welcome to index page %s' % x)
 69 #     time.sleep(3)
 70 #
 71 # def wrapper():
 72 #     start = time.time()
 73 # #   inde(111)
 74 #     func(111)
 75 #     stop = time.time()
 76 #     print(stop - start)
 77 #
 78 #
 79 # wrapper()
 80 
 81 
 82 # # 方案四:调用方式改变了
 83 # import time
 84 #
 85 # def index(x):
 86 #     print('welcome to index page %s' % x)
 87 #     time.sleep(3)
 88 #
 89 # def wrapper(func):
 90 #     start = time.time()
 91 #     func(111)
 92 #     stop = time.time()
 93 #     print(stop - start)
 94 #
 95 #
 96 # wrapper(index)
 97 
 98 
 99 # 方案五:闭包函数
100 # import time
101 #
102 #
103 # def index(x):
104 #     print('welcome to index page %s' % x)
105 #     time.sleep(3)
106 #
107 #
108 # # index(111)
109 #
110 # def outter(func):
111 #     def wrapper(*args, **kwargs):
112 #         start = time.time()
113 #         func(*args, **kwargs)
114 #         stop = time.time()
115 #         print(stop - start)
116 #
117 #     return wrapper
118 #
119 #
120 # index = outter(index)  # index = wrapper的内存地址
121 # # print(f)
122 # index(111)  # wrapper(111)
123 
124 # 方案五:把wrapper伪装的跟被装饰对象一样
125 # import time
126 #
127 #
128 # def index(x):
129 #     print('welcome to index page %s' % x)
130 #     time.sleep(3)
131 #     return 7777
132 #
133 #
134 # def outter(func):  # func = 地址1
135 #     def wrapper(*args, **kwargs):
136 #         start = time.time()
137 #         res = func(*args, **kwargs)
138 #         stop = time.time()
139 #         print(stop - start)
140 #         return res
141 #     return wrapper
142 #
143 #
144 # index = outter(index)  #  index = outter(地址1)  # index -> 地址2
145 #
146 # res = index(111)  # res = wrapper(111)
147 # print(res)
148 
149 # 方案六:把wrapper伪装的跟被装饰对象一样,更进一步
150 import time
151 
152 def index(x):
153     """
154     这是index的帮助信息
155     """
156     print('welcome to index page %s' % x)
157     time.sleep(3)
158     return 7777
159 
160 
161 def outter(func):  # func = 地址1
162     def wrapper(*args, **kwargs):
163         start = time.time()
164         res = func(*args, **kwargs)
165         stop = time.time()
166         print(stop - start)
167         return res
168     wrapper.__doc__ = index.__doc__
169     wrapper.__name__ = index.__name__
170 
171     return wrapper
172 
173 
174 index = outter(index)  #  index = outter(地址1)  # index -> 地址2
175 
176 # help(index)

二、无参装饰器

 1 #无参函数的套用模板
 2 
 3 import time
 4 
 5 def outter(func):
 6     def wrapper(*args,**kwargs):
 7         res = func(*args,**kwargs)
 8         return res
 9     return wrapper
10 
11 @outter
12 def index(x):
13     """
14     这是index的帮助信息
15     """
16     print('welcome to index page %s' % x)
17     time.sleep(3)
18     return 7777
19 
20 index(111)

三、有参装饰器

 1 def outter(engine = 'file'):
 2 def deco2(func2):
 3 def wrapper2(*args, **kwargs):
 4 if engine == 'file':
 5 inp_user = input('username>>>: ').strip()
 6 inp_pwd = input('password>>>: ').strip()
 7 if inp_user == 'egon' and inp_pwd == '123':
 8 print("登录成功")
 9 res2 = func2(*args, **kwargs)
10 return res2
11 else:
12 print("登录失败")
13 elif engine == "mysql":
14 print("基于mysql的认证")
15 elif engine == "ldap":
16 print("基于ladp的认证")
17 
18 return wrapper2
19 return deco2
20 
21 @outter(engine='ldap') # @deco2 # index=deco2(index) # index=wrapper2
22 def index():
23 print('index功能')
24 
25 # index = deco2(index,engine='mysql')
26 
27 
28 # index() # wrapper()
29 
30  
31 
32 # 结论:
33 
34 def outter(x,y):
35 def deco(func):
36 def wrapper(*args,**kwargs):
37 print(x,y)
38 res = func(*args,**kwargs)
39 return res
40 return wrapper
41 return deco
42 
43 
44 @outter(111,22)
45 def index():
46 print('index')
47 
48 index()

四、装饰器语法糖

 1 import time
 2 from functools import wraps
 3 
 4 def outter(func):  # func = 地址1
 5     @wraps(func)
 6     def wrapper(*args, **kwargs):
 7         start = time.time()
 8         res = func(*args, **kwargs)
 9         stop = time.time()
10         print(stop - start)
11         return res
12     # wrapper.__doc__ = func.__doc__
13     # wrapper.__name__ = func.__name__
14     return wrapper
15 
16 
17 @outter  # index = outter(index的内存地址)
18 def index(x):
19     """
20     这是index的帮助信息
21     """
22     print('welcome to index page %s' % x)
23     time.sleep(3)
24     return 7777
25 
26 
27 # res = index(111)
28 # print(res)
29 
30 # help(index)
31 print(index)

五、叠加多个装饰器:加载顺序与执行顺序

 1 # def deco1(func1):  # func1 = wrapper2的内存地址
 2 #     def wrapper1(*args, **kwargs):
 3 #         print('===>运行wrapper1')
 4 #         res1 = func1(*args, **kwargs)
 5 #         return res1
 6 #
 7 #     return wrapper1
 8 #
 9 #
10 # def deco2(func2):  # func2 = wrapper3的内存地址
11 #     def wrapper2(*args, **kwargs):
12 #         print('===>运行wrapper2')
13 #         res2 = func2(*args, **kwargs)
14 #         return res2
15 #
16 #     return wrapper2
17 #
18 #
19 # def deco3(func3):  # func3 = index的内存地址
20 #     def wrapper3(*args, **kwargs):
21 #         print('===>运行wrapper3')
22 #         res3 = func3(*args, **kwargs)
23 #         return res3
24 #
25 #     return wrapper3
26 #
27 #
28 # #                            index = wrapper1的内存地址
29 # @deco1  # deco1(wrapper2的内存地址) -> wrapper1的内存地址
30 # @deco2  # deco2(wrapper3的内存地址) -> wrapper2的内存地址
31 # @deco3  # deco3(index的内存地址)  ->  wrapper3的内存地址
32 # def index():
33 #     print('from index')
34 #     return 123
35 #
36 #
37 # res = index()  # wrapper1()
38 # print(res)
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 import time
49 
50 def deco1(func1):  # func1 = wrapper2的内存地址
51     def wrapper1(*args, **kwargs):
52         start = time.time()
53         res1 = func1(*args, **kwargs)
54         print(time.time() - start)
55         return res1
56 
57     return wrapper1
58 
59 
60 def deco2(func2):  # func2 = wrapper3的内存地址
61     def wrapper2(*args, **kwargs):
62         inp_user = input('username>>>: ').strip()
63         inp_pwd = input('password>>>: ').strip()
64         if inp_user == 'egon' and inp_pwd == '123':
65             print("登录成功")
66             res2 = func2(*args, **kwargs)
67             return res2
68         else:
69             print("登录失败")
70     return wrapper2
71 
72 @deco1
73 @deco2
74 def index():
75     print('index功能')
76     time.sleep(1)
77 
78 index()

 

posted @ 2021-07-06 10:56  Gnomeshghy  阅读(58)  评论(0)    收藏  举报