装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。
完全遵循开放封闭原则
装饰器就是一个函数,本质是:闭包
python做了一个优化,提出了一个语法糖的概念
标准形式的装饰器:
1.语法糖概念 2. 原函数有返回值 3. 原函数有单个或多个参数
import time def func_timer(f): # func_timer装饰器 # f:被装饰的函数 def inner(*args, **kwargs): # *:聚合 start_time = time.time() '''之前是访问被装饰函数之前的操作,功能''' ret = f(*args, **kwargs) # *:打散 # 如果原函数有返回值,要在这里接收它 '''下面是这里是访问被装饰函数之后的操作,功能''' end_time = time.time() print(f'测试函数:{f},耗时:{end_time - start_time}') return ret return inner @func_timer # ==> index = func_timer(index) # 这里实际上是读取该行与下一行 def index(name): # 原函数 """ 这里有很多代码 """ time.sleep(2) # 模拟的网络延迟或者执行代码耗费的时间 print(f'欢迎{name}登录博客园!') return 666 ret1 = index('天帝') # inner('天帝') 没有改变原函数调用方式和代码,并为其增加了函数执行效率的测试功能 print(ret1) @func_timer def dary(age, name): """ 这里有很多代码 """ time.sleep(3) print(f'{age}的{name}来到了日记界面') dary(18, 'LGQ')
带参数的装饰器:
import time def logger(n): def deco_func(f): def inner(*args, **kwargs): ret = f(*args, **kwargs) with open(f'{n}.txt', encoding='utf-8', mode='a') as f1: t = time.strftime('%Y %m %d %H-%M-%S', time.localtime()) msg = f'{t}调用了{f.__name__} ' f1.write(msg) return ret return inner return deco_func """ 带参数的装饰器就是在原本的装饰器基础上在最外层套一层函数,然后return原本装饰器的函数名 1.ret = logger('auth_Log') 2.ret = deco_func 3.@ret 即 @deco_func 4.login = deco_func(login) 5.login = inner 6.login() 即 inner() """ @logger('auth_log') def login(): print("登录逻辑") @logger('auth_log') def register(): print("注册逻辑") @logger def show_goods(): print("查看所有的商品信息") @logger def add_goods(): print("商品加入购物车") login() register()