【python之路24】装饰器
1、装饰器的应用场景
通常IT公司的程序开发是分工的,例如某公司某个部门负责底层函数的开发,另一个部门利用其函数实现高级功能,那么如果负责底层开发的函数需要改动,一般来说不会直接在函数上进行修改,通常利用装饰器在函数外部进行修改。
2、装饰器之@的用法
#!usr/bin/env python # -*- coding:utf-8 -*- #装饰器 def outer(func): func() return lambda :123 #1、首先执行outer函数,并且将其下面的函数名作为参数传给outer #2、将outer的返回值重新赋值给f1,即f1 = outer的返回值 @outer def f1(): print("F1") re = f1() print(re)
3、装饰器的主要作用:原函数不变的情况下,可以在函数的前面或后面增加其功能。
下面的代码:
#!usr/bin/env python # -*- coding:utf-8 -*- def outer(func): def inner1(): print('start') print('start') re = func() print('end') print('end') return re return inner1 def f1(): print('F1') f1 = outer(f1) f1()
上面的代码等价于装饰器:
#!usr/bin/env python # -*- coding:utf-8 -*- def outer(func): def inner1(): print('start') print('start') re = func() print('end') print('end') return re return inner1 @outer def f1(): print('F1') f1()
执行过程如下图:
4、含有两个参数的装饰器
#!usr/bin/env python # -*- coding:utf-8 -*- #含有两个参数的函数 def outer(func): def inner(a1,a2): print('开始计算.......') re = func(a1,a2) print('计算完毕。') return re return inner @outer def add(a1,a2): print("复杂的计算") return a1+a2 r = add(1,3) print(r)
5、任意个参数的装饰器
#!usr/bin/env python # -*- coding:utf-8 -*- def outer(func): def inner(*args,**kwargs): print("开始计算......") r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数 print("计算结束。。") return r return inner @outer def f1(a1,a2): return a1+a2 @outer def f2(a1,a2,a3): return a1+a2+a3 @outer def f3(a1): return a1+1 r1 = f1(10,20) r2 = f2(10,20,30) r3 = f3(10) print(r1,r2,r3)
6、一个函数可以拥有多个装饰器,多个装饰器从上到下执行,例如:
#!usr/bin/env python # -*- coding:utf-8 -*- #一个函数可以拥有多个装饰器 def outer_0(func): def inner(*args,**kwargs): print(3.5) r = func(*args,**kwargs) return r return inner def outer(func): def inner(*args,**kwargs): print("开始计算......") r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数 print("计算结束。。") return r return inner @outer_0 @outer def f1(a1,a2): return a1+a2 @outer def f2(a1,a2,a3): return a1+a2+a3 @outer def f3(a1): return a1+1 r1 = f1(10,20) print(r1) # 结果输出: # 3.5 # 开始计算...... # 计算结束。。 # 30