1、装饰器
(1)本质:装饰器本质就是函数,为其他函数添加附加功能
(2)原则:
- 不修改被 修饰函数的源代码
- 不修改被修饰函数的调用方式
(3)装饰器结构
装饰器=高阶函数+函数嵌套+闭包
(4)装饰器举例:
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print("函数的运行时间是%s"%(stop_time-start_time))
return res
return wrapper
@timmer
def cal(l):
res=0
for i in l:
time.sleep(0.1)
res+=i
return res
res=cal(range(20))
print(res)
#输出结果:
函数的运行时间是2.046844005584717
190
*说明:@装饰器名相当于给装饰器赋值,装饰器后面还可以加参数,装饰的只是最外层函数
2、高阶函数定义
函数的参数是一个函数名,函数的返回值是一个函数名,满足以上其中一个就是高阶函数。
3、使用装饰器给函数加认证功能举例
def auth_func(func):
def wrapper(*args,**kwargs):
username=input("用户名:").strip()
passwd=input("密码:").strip()
if username=="lalala" and passwd=="lalala":
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(name):
print("欢迎%s下次光临"%name)
index()
home("Alex")
shopping("Alex")
说明: 但是以上有个缺点,就是每点击一次界面,都需要输入账密,为了解决这个问题,可以用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()
passwd=input("密码:").strip()
if username=="lalala" and passwd=="lalala":
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(name):
print("欢迎%s下次光临"%name)
index()
home("Alex")
shopping("Alex")
#输出结果:
用户名:lalala
密码:lalala
欢迎来到京东主页
欢迎回家Alex
欢迎Alex下次光临
再次优化,将账号密码放在一个列表里,代码如下:
user_list=[
{"name":"123","passwd":"123"},
{"name":"lalala","passwd":"lalala"},
{"name":"666","passwd":"666"}
]
current_dic={"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic["username"] and current_dic["login"]:
res=func(*args,**kwargs)
return res
username=input("用户名:").strip()
passwd=input("密码:").strip()
for user_dic in user_list:
if username==user_dic["name"] and passwd==user_dic["passwd"]:
current_dic["username"]=username
current_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(name):
print("欢迎%s下次光临"%name)
index()
home("Alex")
shopping("Alex")