'''装饰器的固定格式''' def wrapper(func): def inner(*args, **kwargs): print("执行前") ret = func(*args, **kwargs) print("执行后") return ret return inner @wrapper #func = wrapper(func) def func(): print("func is running...") func()

执行结果:
执行前
func is running...
执行后

'''带参数的装饰器'''
def wrapper(flag):
def outer(func):
def inner(*args, **kwargs):
if flag:
print("在之前.")
ret = func(*args, **kwargs)
print("在之后")
return ret
else:
return func(*args, **kwargs)
return inner
return outer

@wrapper(1) # 先执行wrapper(1),返回outer,@outer就是语法糖
def func():
print("func is running...")

@wrapper(0) #先执行wrapper(0),返回outer,@outer就是语法糖
def func2():
print("func2 is running...")

func()
func2()
执行结果:
在之前.
func is running...
在之后
func2 is running..

'''写日志'''
def record_log(file):
def log(fn):
def inner(*args, **kwargs):
ret = fn(*args, **kwargs)
with open(file, mode="a", encoding="utf-8") as f: #记录日志
f.write("调用函数: %s" % fn.__name__)
return ret
return inner
return log

@record_log('func1.txt')
def func1(): # 日志放在func1.txt
print("我是func1")

@record_log('func2.txt')
def func2(): # 日志放在func2.txt
print("我是func2")

func1()
func2()

执行结果:
我是func1
我是func2

 
'''同一个函数被多个装饰器修饰'''
def wrapper1(func):
def inner(*args, **kwargs):
print("执行wrapper1前")
ret = func(*args, **kwargs)
print("执行wrapper1后")
return ret
return inner

def wrapper2(func):
def inner(*args, **kwargs):
print("执行wrapper2前")
ret = func(*args, **kwargs)
print("执行wrapper2后")
return ret
return inner

def wrapper3(func):
def inner(*args, **kwargs):
print("执行wrapper3前")
ret = func(*args, **kwargs)
print("执行wrapper3后")
return ret
return inner

@wrapper1 #3.装饰wrapper2后的结果
@wrapper2 #2.装饰wrapper3后的结果
@wrapper3 #1.装饰func函数
def func():
print("func is running...")

func()
执行结果:
执行wrapper1前
执行wrapper2前
执行wrapper3前
func is running...
执行wrapper3后
执行wrapper2后
执行wrapper1后

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。