Python笔记四(装饰器进阶)

进阶的需求

1、第一种情况

需要给500个函数添加装饰器,如果你逐个添加或者取消添加会非常麻烦,并且浪费成本;
现在,你可以设计你的装饰器 来确认是否生效。

 1 import time
 2 FLAG = True#全局变量
 3 def outer(flag):
 4     def timmer(f):
 5         def inner(*args,**kwargs):
 6             if flag == True:#如果flag为True,原有的函数前后增加功能,且不改变原函数的调用方式
 7                 start_time = time.time()
 8                 ret = f(*args,**kwargs)
 9                 end_time = time.time()
10                 print(end_time - start_time)
11             else:#如果flag不为True,只执行原有的函数,且不改变原函数的调用方式
12                 ret = f(*args, **kwargs)
13             return ret
14         return inner
15     return timmer
16 
17 @outer(FLAG)   # func = timmer(func)
18 def func(a,b):
19     print('begin func',a)
20     time.sleep(0.1)
21     print('end func',b)
22     return True
23 
24 func(1,2)
25 
26 #执行结果
27 #>>>begin func 1
28 #>>>end func 2
29 #>>>0.10027241706848145

2、第二种情况

装饰器除了可以计算函数的执行时间,还可以记录登录、记录日志等;
现在假如要访问博客园首页或其他内容的前提,需要用户先登录才能访问,设计装饰器。

 1 import time
 2 login_info = {'alex':False}
 3 def login(func):   # manager
 4     def inner(name):
 5         if login_info[name] != True:
 6             user = input('user :')
 7             pwd = input('pwd :')
 8             if user == 'alex' and pwd == 'alex3714':
 9                 login_info[name] = True
10         if login_info[name] == True:
11             ret = func(name)     # timmer中的inner
12             return ret
13     return inner
14 
15 @login
16 def index(name):
17     print('欢迎%s来到博客园首页~'%name)
18 
19 @login
20 def manager(name):
21     print('欢迎%s来到博客园管理页~'%name)
22 
23 index('alex')#由于login_info[('alex']==Flase,所以第一次访问需要登录
24 index('alex')
25 manager('alex')
26 manager('alex')
27 
28 #执行结果
29 #>>>user :alex
30 #>>>pwd :alex3714
31 #>>>欢迎alex来到博客园首页~
32 #>>>欢迎alex来到博客园首页~
33 #>>>欢迎alex来到博客园管理页~
34 #>>>欢迎alex来到博客园管理页~

3、第三种情况

1)因为要用到两个装饰器,开始之前先解释一下两个装饰器装饰一个函数的执行过程:

 1 def wrapper1(func): 
 2     def inner1():
 3         print('wrapper1 ,before func')
 4         func() 
 5         print('wrapper1 ,after func')
 6     return inner1
 7 
 8 def wrapper2(func): 
 9     def inner2():
10         print('wrapper2 ,before func')
11         func() 
12         print('wrapper2 ,after func')
13     return inner2
14 
15 @wrapper2 
16 @wrapper1 
17 def f():
18     print('in f')
19 
20 f()

2)在第二种情况的基础上还要计算函数index、manger的执行时间:

 1 import time
 2 login_info = {'alex':False}
 3 def login(func):   # manager
 4     def inner(name):
 5         if login_info[name] != True:
 6             user = input('user :')
 7             pwd = input('pwd :')
 8             if user == 'alex' and pwd == 'alex3714':
 9                 login_info[name] = True
10         if login_info[name] == True:
11             ret = func(name)     # timmer中的inner
12             return ret
13     return inner
14 
15 def timmer(f):
16     def inner(*args,**kwargs):
17         start_time = time.time()
18         ret = f(*args,**kwargs)     # 调用被装饰的方法
19         end_time = time.time()      #
20         print(end_time - start_time)
21         return ret
22     return inner
23 
24 @login
25 @timmer
26 def index(name):
27     print('欢迎%s来到博客园首页~'%name)
28 
29 @login
30 @timmer    # manager = login(manager)
31 def manager(name):
32     print('欢迎%s来到博客园管理页~'%name)
33 
34 index('alex')
35 index('alex')
36 manager('alex')
37 manager('alex')

猜你喜欢

转载自www.cnblogs.com/xingye-mdd/p/8948168.html