Python知识点-装饰器decorator
装饰器的作用就是在已经写好的函数上,不改动写好的函数的前提下,增加额外的功能
比如有100个不一样的函数,我想在这100个函数都额外增加一个相同的功能,利用装饰器可以减少重复代码
1.简单的装饰器
#普通装饰器不带参数 def outer(func): def inner(*args,**kwargs): print('装饰器内部函数开始') func(*args,**kwargs) print('装饰器内部函数结束') return inner @outer def foo(a,b): print('***********') print(a+b) print('***********') foo(3,4) #等同于下面这种写法: def outer(func): def inner(*args,**kwargs): print('装饰器内部函数开始') func(*args,**kwargs) print('装饰器内部函数结束') return inner def foo(a,b): print('***********') print(a+b) print('***********') bar=outer(foo) bar(3,4)
2.带参数的装饰器
#带参数的装饰器 def war(a='xiaoming'): def outer(func): def inner(*args,**kwargs): if a == 'xiaoming': print('传递的参数有效') else: print('传递的参数无效') print('装饰器内部函数开始') func(*args,**kwargs) print('装饰器内部函数结束') return inner return outer @war('xiaoming') def foo(a,b): print('***********') print(a+b) print('***********') foo(1,2) #等同于下面的写法 def war(a='xiaoming'): def outer(func): def inner(*args,**kwargs): if a == 'xiaoming': print('传递的参数有效') else: print('传递的参数无效') print('装饰器内部函数开始') func(*args,**kwargs) print('装饰器内部函数结束') return inner return outer def foo(a,b): print('***********') print(a+b) ww=war('xiaoming') bar=ww(foo) bar(3,4)
3.多个装饰器
绑定多个装饰器 def outer1(func): print('这是装饰器11111 outer') def inner1(*args, **kwargs): print('这是装饰器11111 inner') func(*args, **kwargs) print('装饰器11111 inner 结束') return inner1 def outer2(func): print('这是装饰器22222 outer') def inner2(*args, **kwargs): print('这是装饰器22222 inner') func(*args, **kwargs) print('装饰器22222 inner 结束') return inner2 # @outer2 # @outer1 def foo(): print('这是一个普通的foo函数') # foo() #执行顺序为先执行了outer1,foo这个函数被带到了outer1中替代func,执行了外层print,然后return inner1 #然后把inner1这个函数传到了outer2中,inner1代替了outer2中的func,这时执行了outer2的print,再接着返回了 inner2函数 #没有其他装饰器了,这是后就执行了inner2 函数,执行到inner2 的func()时,这时候func代表的事inner1这个函数,然后就跳到inner1去执行函数,直到结束返回inner2. out1 = outer1(foo) out2 = outer2(out1) out2() #执行结果: ''' 这是装饰器11111 outer 这是装饰器22222 outer 这是装饰器22222 inner 这是装饰器11111 inner 这是一个普通的foo函数 装饰器11111 inner 结束 装饰器22222 inner 结束 '''