装饰器就是闭包
使用装饰器需要在定义函数时@装饰器函数名。相当于执行func=wrapper(func)=inner
但是如果调用func.__name__ 查看的是Inner的函数名,同样查看函数文档也为inner的文档。
可以定义inner.__name__=func.__name__.
当然python内置的模块给出了wraps方法.
带参数的装饰器用两个闭包 @外部函数名加括号(参数)相当于执行这个函数,返回要用wrapper 意思还是@wrapper 但此时外部函数的参数已经传到inner里了
多个装饰器修饰一个函数的执行顺序及原理
比较直观的执行顺序,像是套娃从最外层执行,也就是最顶的wrapper2,但在原理上是先执行的wrapper1
原理是wrapper1将它下边离它最近的函数f传进,f=wrapper1(f)=inner1
而wrpapper2又将离它最近的inner1作为参数传进来 f=wrapper2(inner1)=inner2
所以f函数在调用时是套娃结构的顺序。