一、什么是装饰器
装饰器就是用一个函数去扩展另一个已存在的函数的功能(扩展性对于一个应用程序来说是非常重要的能力,任何应用程序都需要扩展,于是出现了开闭原则)
开闭原则:对修改关闭,对扩展开放
不允许修改源代码以及调用方式
装饰器就是一种保证不修改源代码,也不修改调用方式,还能给函数添加新功能的方式
二、无参装饰器(完整版)
import time
def download():
print('download run!')
def outer(func):
def run_time(*args,**kwargs):
boot_time = time.time()
res = func(*args,**kwargs):
boot_time=time.time()
res=func(*args,**kwargs)
print("耗时:",time.time()-boot_time)
return res
return run_time()
download=outer(download)
三、装饰的语法糖(提供输出日记(日志)功能)
import time
def logger(func):
def wrapper(*args,**kwargs):
print("时间:%s func:%s" % (time.time(),func._name_))
res = func(*args,**kwargs)
return res
return wrapper
@logger
def login():
print("登陆成功。。")
login()
三、同时叠加多个装饰器
impot time
def logger(func):
def wrapper(*args,**kwargs):
print("时间:%s func:%s" % (time.time(),func._name_))
res= func(*args,**kwargs)
return res
return wrapper
@logger
def login():
print("登陆成功。。。")
login()
四、装饰器在购物车中的应用
is_login = False
def auth(func):
def wrapper(*args,**kwargs):
if is_login:
func(*args,**kwargs)
else:
print("还没有登录请先登录。。。")
login()
return wrapper
def login():
global is_login
name=input('name:').strip()
pwd=input('pwd:')。strip()
if name=='alan' and pwd == '123':
print('登陆成功!!')
is_login=True
@auth
def shopping():
print("请登录。。。")
@auth
def collection():
print()
def main():
while True:
func={"1":login,"2":shopping,"3":collection}
print("""
1、登录
2、购物车
3、收藏夹
""")
res = input(">>>:"),strip()
if res in funcs:
funcs[res]()
else:
print("输入错误")
main()
五、有参装饰器
需求:提供一个输出日志的装饰器,可以指定日志的输出位置,打印到控制台或者文件中
import time
def outer(location)
def logger(func):
def wrapper(*args,**kwargs):
if location=="cmd":
print("时间:%s func:%s" %(time.time().func_name_))
elif location="file":
with open("a.log","a",encoding="utf-8")as f:
f.write("时间:%s func:%s" % (time.time(),func_name_))
else:
print("位置不对,,,,,,必须是file或者是cmd")
return func(*args,**kwargs)
return wrapper
return logger
@outer("files")
def test():
print("test run")
test()