装饰器的作用:
不想修改函数的调用方式但是又想在原来的函数前后添加新的功能
装饰器的原则:开放封闭原则
对扩展是开放的
对修改是封闭的
装饰器语法糖:在被修饰函数头上添加@装饰器名
1.装饰器固定模式
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
def werpper(func): def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @werpper def dom(): print("") return "" dom()
2.完美模式
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
from functools import wraps def werpper(func): @wraps()#为了获取原函数信息 例如dom.__name_获取原函数名_ dom.__doc__获取原函数信息 def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @werpper def dom(): print("") return "" dom()
3.带参数装饰器
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
from functools import wraps def demo(**kwargs): def werpper(func): @wraps()#为了获取原函数信息 例如dom.__name_获取原函数名_ dom.__doc__获取原函数信息 def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @demo("任何数据类型") def dom(): print("") return "" dom()
4.多个装饰器修饰一个函数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
from functools import wraps def demo2(**kwargs): def werpper(func): @wraps()#为了获取原函数信息 例如dom.__name_获取原函数名_ dom.__doc__获取原函数信息 def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner def demo1(**kwargs): def werpper(func): @wraps()#为了获取原函数信息 例如dom.__name_获取原函数名_ dom.__doc__获取原函数信息 def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @demo2("任何数据类型") @demo1("任何数据类型") def dom(): print("") return "" dom() """执行顺序套娃形式 demo2 func()前-—> demo1 func()前——>func()——>demo1 func()后——>demo2 func()后 """