装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
先定义一个基本的装饰器:
def orter(func): #定义装饰器
def inner():
print("之前")
s = func() #调用原传入参数函数执行
print("之后")
return s #return原函数返回值
return inner #将inner函数return给name函数
@orter #调用装饰器(将函数name当参数传入orter装饰器)
def name():
print("原本")
return True #name原函数return True
#当定义一个接受值时,有返回值
ret = name()
print(ret)
#输出结果
之前
原本
之后
True
#当直接执行时函数name函数,没有return值
def orter(func): #定义装饰器
def inner():
print("之前")
s = func() #调用原传入参数函数执行
print("之后")
return inner #将inner函数return给name函数
@orter #调用装饰器(将函数name当参数传入orter装饰器)
def name():
print("原本")
name()
#输出结果
之前
原本
之后
给装饰器传参数:
def orter(func):
def inner(a,b): #接收传入的2个参数
print("之前")
s = func(a,b) #接收传入的原函数2个参数
print("之后")
return s
return inner
@orter
def name(a,b): #接收传入的2个参数,并name整体函数当参数传入orter装饰器
print("This is name.%s,%s"%(a,b))
return True
ret = name('yu','mei') #传入2个参数
print(ret)
输出结果:
之前
This is name.yu,mei
之后
True
给装饰器传万能参数:
def orter(func):
def inner(*args,**kwargs): #万能参数接收多个参数
print("之前")
s = func(*args,**kwargs) #万能参数接收多个参数
print("之后")
return s
return inner
@orter
def name(a,b,c): #接受传入的多个参数
print("This is name.%s,%s%s"%(a,b,c))
return True
ret = name('yu','mie','car')
print(ret)
输出结果: 之前 This is name.yu,mei,car 之后 True
一个函数应用多个装饰器方法:
def orter(func):
def inner(*args,**kwargs): #万能参数接收多个参数
print("第一之前")
s = func(*args,**kwargs) #万能参数接收多个参数
print("第一之后")
return s
return inner
def orter_2(func):
def inner(*args,**kwargs): #万能参数接收多个参数
print("第二之前")
s = func(*args,**kwargs) #万能参数接收多个参数
print("第二之后")
return s
return inner
@orter
@orter_2
def name(a,b,c,k1=''): #接受传入的多个参数
print("This is name.%s,%s,%s,%s"%(a,b,c,k1))
return True
ret = name('yu','mie','car')
print(ret)
#输出结果
第一之前
第二之前
This is name.yu,mie,car,
第二之后
第一之后
True
带参数的装饰器 直接改变False或者True就可以实现用或不用装饰器
假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
一个一个的取消掉? 没日没夜忙活3天。。。
过两天你领导想通了,再让你加上。。
def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111) func()