装饰器的作用:
对程序者来说:就是为了在遵循开放-封闭原则的前提下,为被装饰对象添加新的功能
对于使用者来说:从表面上来看使用方式和以前并没有改变
import time def timer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return res return wrapper @timer def login(): time.sleep(1) ''' 登录验证功能... :return: 哈哈 ''' print('欢迎光临!') login()
对上诉装饰器,实现了为登录函数增加一个运行时间统计功能,对于使用者来说,仍然是调用login()来触发该功能,但是
查看该函数的属性时,发生了变化,以__name__,和__doc__为例:
print(login.__name__) print(login.__doc__) #运行结果:---> #wrapper #None
从程序逻辑来看本该是这样,现在这个变量名login时指向wrapper函数的内存地址的,
那么我们只需要在wapper函数内为其添加与原login函数相同的属性即可,例如:
import time def timer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return res wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ return wrapper @timer def login(): ''' sadad :return: ''' time.sleep(1) print('欢迎光临!') login() print(login.__name__) print(login.__doc__)
而wraps可以帮我们完成所有的替换:
import time from functools import wraps def timer(func): @wraps(func) def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return res return wrapper @timer def login(): ''' sadad :return: ''' time.sleep(1) print('欢迎光临!') login() print(login.__name__) print(login.__doc__)
python之路---装饰器补充(wraps应用)
最新推荐文章于 2024-06-19 08:48:18 发布