理论:装饰器就是运行一个函数之前首先运行装饰器函数,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
1、单个装饰器装饰一个函数:通用装饰器看下面代码
def verify(func): def call_fun(*args, **kwargs): print('权限验证1') return func(*args, **kwargs) return call_fun @verify def test1(num): print(num) test1(2222)
2、多个装饰器装饰同一个函数
# 多个装饰器装饰同一个函数 def set_func1(func): def call_func1(*args, **kwargs): print('我是call_fun1') func(*args, **kwargs) print('11111') return call_func1 def set_func2(func): def call_func2(*args, **kwargs): print('我是call_fun2') func(*args, **kwargs) print('222222222222222') return call_func2 @set_func1 # test=set_func1(call_func2)=call_func1 @set_func2 # test=set_func2(test)=call_func2 def test(): print('test test') test()
运行结果:
我是call_fun1
我是call_fun2
test test
222222222222222
1111
上述代码解释:
程序从上往下运行,遇到@set_func1判断下面不是一个函数,所以不装饰继续往下,遇到@set_func2判断下面是一个函数进行装饰,即test=set_func2(test)=call_func2,装饰
完后,@set_func1下面变成了一个call_func2函数,此时也需要装饰,即test=set_func1(call_func2)=call_func1,装饰完毕,程序运行的顺序是:先调用@set_fun1中的call_func1,运行其中的func(),在func()中调用call_func2,再在call_func2中运行func(),此时的func()指向的是原函数test()
所以这里关键点在:最上面一个装饰器中的func()函数指向的是下面一个装饰器中的内部函数,即call_func()