先来了解函数和执行函数在python的区别
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127173816579-1280012597.png)
我再重新定义一个函数,在函数前面加上@set_func
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127173849294-1466123577.png)
执行结果如下:
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127174250578-1759919167.png)
函数前面没有加@set_fun
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127174303984-1285166008.png)
执行结果如下:
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127174313284-223599124.png)
是不是可以不修改原来的函数架构就可以添加功能,这就是装饰器。
看一个详细的例子
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127174053519-161837317.png)
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127174516209-1390189448.png)
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127174535875-452184919.png)
装饰器只有@就有了,而不是等到调用函数才有的
对不定长参数的函数进行装饰实例如下:
有多少参数都可以,以不定长参数接收,传以拆包地传
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181127204026417-1740294774.png)
以上的都是多个函数对同一个装饰器装,多个装饰器对同一个函数装。
哪个装饰器下面有函数,哪个装饰器先装。执行还是从上到下执行。
![](https://img2018.cnblogs.com/blog/1546038/201811/1546038-20181128111754160-1524319564.png)