什么是装饰器?
装饰器就是做装饰的,装饰谁?装饰的是函数,也就是给函数化妆。为什么要给函数化妆呢?其实就是要给函数添加一些功能,为什么要用装饰器呢?为啥不能直接修改函数呢?简单粗暴!因为加上装饰器的话,可以不改变人家原来的函数,防止你乱改人家代码出错,可维护性更好
假如我们要给一个返回字符串的函数加上标签
>>> def say_hello(name): return "Hello "+name+"!" >>> def p_decorate(func): def func_wrapper(name): return '<p>'+func(name)+'</p>' return func_wrapper >>> my_say_hello=p_decorate(say_hello) >>> my_say_hello("xiaoming") '<p>Hello xiaoming!</p>' >>>
装饰器是什么原理呢?
其实就是将原来的函数加一些功能变成一个新的函数,然后再把这个新的函数返回
比如p_decorate函数会返回一个装饰好的新函数func_wrapper
func_wrapper函数负责给say_hello函数化妆,也就是加新的东西,其调用原来的函数加上标签
最后p_decorate函数将化妆好的func_wrapper函数返回
这样我们将say_hello函数传入装饰器,得到了装饰好的新函数my_say_hello,我们调用就得到了结果
语法糖调用
def p_decorate(func): def func_wrapper(name): return '<p>'+func(name)+'</p>' return func_wrapper @p_decorate def say_hello(name): return "Hello "+name+"!" print(say_hello("Max"))
防止函数名被改
多个装饰器使用
装饰器传参
使用语法糖
不使用语法糖