装饰器就是在调用原有函数的时候在外边套上两层def实现偷梁换柱的效果
在写装饰器的时候会十分的麻烦,不够方便,所以就有了语法糖
在调用@装饰器名称的工作流程:运行到这行代码会立刻调用这个装饰器功能,将@装饰器名称下的函数内存地址传进@中最后会把得到的结果赋值给原函数名
这样的方式是能够以假乱真的但是,如果我们对原函数进行属性的调用就会出现原函数的属性是不会被装饰器所装饰的,如果需要装饰器装饰原函数的属性那么就需要在原来的装饰基础上装饰一遍所有的属性,如果真的按照这个方式装饰了的话会非常麻烦,不仅是装饰的过程麻烦而且原函数如果改动那被装饰的属性就需要再一次的修改。
对于这个问题,python中有一个模块functools。
> [!note] 注意
> 需要先定义装饰器语法,之后才能调用@装饰器名称
```python# -*- coding: utf-8 -*-'''@File : 12-语法糖.py@Author : HY @Version : 1.0@Desc : None'''import timedef outer(fun): # fun=func def wrapper_1(*args,**kwargs): start=time.time() ret = fun(*args,**kwargs) end=time.time() print(f"func1时间差{end-start}") return ret return wrapper_1@outer #在原有的函数上边调用@装饰器名称,这样会极大减少重复代码的操作def phone(num): str_1=f"当前电量{num}" print(str_1) for i in range(num,101): time.sleep(0.02) print(f"\r当前充电中{'s'*i}{i}%",end="") print("电量充满了!") return 100phone(20)'''@OutPut : 当前电量20当前充电中ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss100%电量充满了!func1时间差1.6464688777923584'''``````python# -*- coding: utf-8 -*-'''@File : 12-语法糖.py@Author : HY @Version : 1.0@Desc : None'''import timedef outer(fun): def wrapper_1(*args,**kwargs): start=time.time() ret = fun(*args,**kwargs) end=time.time() print(f"func1时间差{end-start}") return ret return wrapper_1@outerdef phone(num): """这是函数的解释""" str_1=f"当前电量{num}" print(str_1) for i in range(num,101): time.sleep(0.02) print(f"\r当前充电中{'s'*i}{i}%",end="") print("电量充满了!") return 100phone(20)phone.__doc__= """这是函数的解释"""res =phone.__doc__print(res)'''@OutPut : 当前电量20当前充电中ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss100%电量充满了!func1时间差1.6479463577270508这是函数的解释'''``````python# -*- coding: utf-8 -*-'''@File : 12-语法糖.py@Author : HY @Version : 1.0@Desc : None'''from functools import wrapsimport timedef outer(fun): @wraps(fun) def wrapper_1(*args,**kwargs): start=time.time() ret = fun(*args,**kwargs) end=time.time() print(f"func1时间差{end-start}") return ret return wrapper_1@outerdef phone(num): """这是函数的解释""" str_1=f"当前电量{num}" print(str_1) for i in range(num,101): time.sleep(0.02) print(f"\r当前充电中{'s'*i}{i}%",end="") print("电量充满了!") return 100phone(20)print(phone.__doc__)'''@OutPut : 当前电量20当前充电中ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss100%电量充满了!func1时间差1.6637046337127686这是函数的解释'''```