1.大总结,修饰器就是把被修饰的函数作为一个参数传入修饰器函数。格式如下
@修饰器函数
def 函数
修饰器函数是要至少套一个函数的,即:
def xxx
def yyy
。。。
return yyy
这样,当你在某个函数上面加修饰器以后,以后再单独执行这个函数,都是自动调用修饰器的。
否则,修饰器只调用一次。具体见前4步
2.修饰器函数分2中,带参数和不带参数的
1.1)不带参数的修饰器函数:
被修饰的函数作为修饰器的第一层参数,格式如下:
def 修饰器函数(被修饰函数名):
def xxx():
...
执行被修饰函数
...
return a【被修饰函数的执行结果(一般返回这个,也可以自行处理返回别的,也可以不返回,自己定义)】
retrun xxx
执行原理:将被修饰函数作为一个参数代入修饰器,返回一个xxx函数,xxx函数被执行,最后返回a。我认为,def句作为定义语句是不直接执行的,所以修饰器函数首先执行的是返回xxx函数,然后执行xxx函数的内容。同理如果里面套了多个函数,也是先执行第一层的return,根据return结果执行
1.2)修饰器不带参数,但是被修饰函数带参数:
因为最终要在修饰器函数里面执行被修饰函数的,那如果被修饰函数带参数,这个参数怎么传入呢?
在要执行被修饰函数的那一层定义函数中,要求传入参数。参数数量不确定时,可以用*args, **kwargs自动适应参数个数和名称
1.3)修饰器带参数
修饰器的参数可以就是一个变量,也可以是一个类。参数是个类(cls的话,就可以在修饰器函数内部任意使用该类的属性、方法(cls.属性,cls.方法)。
如果修饰器带参数,那么修饰器的第一层参数就是修饰器自身的参数,第二层才是被修饰函数参数,又因为修饰器重复调用要至少2层函数,所以修饰器带参数的话,那么该修饰器就至少三层:
def 修饰器(修饰器参数):
def xxx(被修饰函数名):
def yyy:
...
return yyy
retun xxx
3.修饰器的跨文件使用
只要把修饰器及修饰器相关的参数(类)import进来,就可以直接用
4.一个函数应用多个修饰器
如步骤9