【python第四篇】装饰器
一.装饰器
1.本质就是一个函数,功能是为其他函数添加附加功能
2.原则:1.不修改被修饰函数的源代码;2.不修改被修饰函数的调用方式
3.装饰器=高阶函数+函数嵌套+闭包
3.1高阶函数:1.函数接收的参数是一个函数名;2.函数的返回值是一个函数名==满足上述任意一个条件,都可以称之为高阶函数
3.2 函数闭包装饰器基本实现
def timmer(func): #func=test
def wrapper():
s_time=time.time()
func() #就是在运行test()
t_time=time.time()
print ("运行时间%s"%(t_time-s_time))
return wrapper
@timmer #语法糖,相当于test=timmer(test)
def test():
time.sleep(3)
print ("运行完毕")
test() #执行的就是wrapper
3.3 函数闭包加上返回值
import time
def timmer(func):
def wrapper():
s_time=time.time()
res=func()
t_time=time.time()
print ("运行时间%s"%(t_time-s_time))
return res
return wrapper
@timmer
def test():
time.sleep(3)
print ("运行完毕")
return("这是test返回值")
res=test()
print (res)
3.4函数闭包加上参数
import time
def timmer(func):
def wrapper(*args,**kwargs):
s_time=time.time()
res=func(*args,**kwargs)
t_time=time.time()
print ("运行时间%s"%(t_time-s_time))
return res
return wrapper
@timmer
def test(name,age):
time.sleep(3)
print ("运行完毕")
return("这是test返回值")
res=test("lex",18)
print (res)
3.5 函数闭包补充:解压序列
#取序列中首尾两个值 l=[1,7,8,5,34567,56,34,57] a,*_,c=l print(a) print(c) #取序列中第一个和第二个,最后一个和倒数第二个的两个值 a,b,*_,c,d=l print(a) print(b) print(c) print(d) #交换两个元素的值 x=1 y=2 x,y=y,x print(x) print(y)
3.6函数闭包为函数加上认证功能
def auth_func(func):
def wrapper(*args,**kwargs):
username=input("用户名:").strip()
password=input("密码:").strip()
if (username=="sb")and (password =="123"):
res=func(*args,**kwargs)
return res
else:
print("登录失败")
return wrapper
@auth_func
def index():
print("欢迎来到京东")
@auth_func
def home(name):
print("%s欢迎回家"%name)
@auth_func
def shopping_car(name):
print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))
index()
home("小东")
shopping_car("小东")
3.7 函数闭包模拟session
user_dic={"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if user_dic["username"] and user_dic["login"]:
res=func(*args,**kwargs)
return res
username=input("用户名:").strip()
password=input("密码:").strip()
if (username=="sb")and (password =="123"):
user_dic["username"]=username
user_dic["login"]= True
res=func(*args,**kwargs)
return res
else:
print("登录失败")
return wrapper
@auth_func
def index():
print("欢迎来到京东")
@auth_func
def home(name):
print("%s欢迎回家"%name)
@auth_func
def shopping_car(name):
print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))
index()
home("小东")
shopping_car("小东")
3.8 函数闭包模拟session(多个用户名和密码的校验)
user_list=[{"username":"Alex","password":"13"},
{"username":"sb","password":"139"},
{"username":"as","password":"13"}]
user_dic={"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if user_dic["username"] and user_dic["login"]:
res=func(*args,**kwargs)
return res
username=input("用户名:").strip()
password=input("密码:").strip()
for i in user_list:
if username==i["username"] and password==i["password"]:
user_dic["username"]=username
user_dic["login"]= True
res=func(*args,**kwargs)
return res
else:
print("登录失败")
return wrapper
@auth_func
def index():
print("欢迎来到京东")
# @auth_func
# def home(name):
# print("%s欢迎回家"%name)
# @auth_func
# def shopping_car(name):
# print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))
#
# index()
# home("小东")
print("before---",user_dic)
index()
print("after---",user_dic)
3.9 函数闭包带参数装饰器
user_list=[{"username":"Alex","password":"13"},
{"username":"sb","password":"139"},
{"username":"as","password":"13"}]
user_dic={"username":None,"login":False}
def auth(auth_type="filedb"):
def auth_func(func):
def wrapper(*args,**kwargs):
print("认证类型是:",auth_type)
if auth_type=="filedb":
if user_dic["username"] and user_dic["login"]:
res=func(*args,**kwargs)
return res
username=input("用户名:").strip()
password=input("密码:").strip()
for i in user_list:
if username==i["username"] and password==i["password"]:
user_dic["username"]=username
user_dic["login"]= True
res=func(*args,**kwargs)
return res
else:
print("登录失败")
elif auth_type=="bb":
print("开始bb")
res=func(*args,**kwargs)
return res
elif auth_type=="cc":
print("开始cc")
res=func(*args,**kwargs)
return res
return wrapper
return auth_func
@auth(auth_type="filedb")
def index():
print("欢迎来到京东")
@auth(auth_type="bb")
def home(name):
print("%s欢迎回家"%name)
@auth(auth_type="cc")
def shopping_car(name):
print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))
index()
home("小东")
shopping_car("小东")

浙公网安备 33010602011771号