1.对大批量函数添加装饰器,而且不定期的开关
# 多个装饰器,添加批量管理的开关
import time
FLAG = False
def outer(flag):
def timer(f1):
def inner(*args,**kwargs):
if flag == True:
start_time = time.time()
ret = f1(*args,**kwargs)
end_time = time.time()
print('运行时间为 %s' % (end_time-start_time))
else:
ret = f1(*args,**kwargs)
return ret
return inner
return timer
@outer(FLAG)
def func1(a, b):
print('func1开头 -- %s' % a)
time.sleep(0.1)
print('func1结尾 -- %s' % b)
@outer(FLAG)
def func2(a, b):
print('func2开头 -- %s' % a)
time.sleep(0.1)
print('func2结尾 -- %s' % b)
# func1开头 -- a
# func1结尾 -- b
# func2开头 -- c
# func2结尾 -- d
2.使用装饰器进行登录检测
# 第二种情况
# 使用装饰器进行登陆检测,如果已经登陆,则不用再次登陆
#
import time
login_info = {'alex':False}
def login(func1):
def inner(name):
if login_info[name] != True:
user = input('user: ')
pwd = input('pwd: ')
if user == 'alex' and pwd == 'alex3714':
login_info[name] = True
if login_info[name] == True:
ret = func1(name)
return ret
return inner
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
end_time = time.time()
print(end_time-start_time)
return ret
return inner
@login # index = login(index) -- inner
@timmer
def index(name):
print('欢迎%s来到博客园首页---' % name)
time.sleep(0.3)
@login
@timmer
def manager(name):
print('欢迎%s来到博客园管理界面---' % name)
time.sleep(0.3)
index('alex')
manager('alex')
index('alex')
manager('alex')
# user: alex
# pwd: alex3714
# 欢迎alex来到博客园首页---
# 0.30012965202331543
# 欢迎alex来到博客园管理界面---
# 0.30124926567077637
# 欢迎alex来到博客园首页---
# 0.3006711006164551
# 欢迎alex来到博客园管理界面---
# 0.3006777763366699
3.多个装饰器装饰一个函数,结构类似套娃
# 多个装饰器装饰一个函数,结构类似于套娃结构
def wrapper1(f1): #f
def inner1():
print('wrapper1 before func')
f1() # f
print('wrapper1 after func')
return inner1
def wrapper2(f2): #inner
def inner2():
print('wrapper2 before func')
f2() # inner1
print('wrapper2 after func')
return inner2
# 在装饰器执行的时候,是从下向上依次执行
@wrapper2 # f = wrapper2(inner1) --> inner2
@wrapper1 # f = wrapper1(f) --> inner1
def f():
print('in f')
f() #inner2
# wrapper2 before func
# wrapper1 before func
# in f
# wrapper1 after func
# wrapper2 after func
# 运行过程
def wrapper1(f1): # 3- f1 = f
def inner1():
print('wrapper1 before func') ## 14=
f1() ## 15= f()
print('wrapper1 after func') ## 17=
return inner1 # 4- inner1
def wrapper2(f2): # 7- f2 = inner1
def inner2(): ## 11=
print('wrapper2 before func') ## 12=
f2() ## 13= inner1
print('wrapper2 after func') ## 18=
return inner2 # 8- inner2
# 在装饰器执行的时候,是从下向上依次执行
# 当遇到多个装饰器装饰一个函数的时候,会一直向下走,直到找到被装饰的函数
# 是一个先往下走,再往上回的过程
@wrapper2 # 6- f = wrapper2(f) --> f = wrapper2(inner1) # 9- f = inner2 **** 装饰过程结束
@wrapper1 # 2- f = wrapper1(f) # 5- f = inner1 --> f
def f(): # 1- 从找到的f开始
print('in f') ## 16=
f() # 10- 开始调用 f()相当于inner2()