python中的装饰器
python中的装饰器decorator很像java中的环绕代理(AOP)。装饰器可以增强被装饰(代理)的方法,具体而言,它可以控制被代理函数知否被执行,还可以在执行被代理函数之前执行一些逻辑,也可以执行被代理函数之后执行一些逻辑。
装饰器定义格式
不传入额外参数的装饰器
def 装饰器名称(x(该参数用于接收被代理函数。参数与参数名无关)):
def 代理函数名称(*args,**kwargs):
# args是一个元组,里面为被代理函数所需的所有参数。
# 这里写被代理函数执行前的逻辑
result=x(*args,**kwargs)
# 这里写被代理函数执行后的逻辑
return result# 这里要返回被代理函数的结果(固定写法)
def 装饰器其他函数(该函数参数):
return
def 装饰器其他函数(该函数参数):
return
return 代理函数名称# (固定写法)这里返回哪个函数,哪个函数就作为代理函数
@装饰器名称
def 被代理的函数(该函数参数):
# 该函数逻辑
# 使用装饰器
被代理的函数(该函数参数)# 这里虽然调用的是被代理的函数,但执行的是 代理函数
带参数的装饰器
def 装饰器名称(x):
def 其他函数(参数表):
return
def 其他函数(参数表):
return
def dec(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
def 其他函数():
return
return wrapper# 返回的是wrapper,所以执行的是wrapper
return dec # 返回的是函数dec,所以dec为代理函数。
@装饰器名称(x)
def 被代理函数(参数表):
经典示例
不带参数
def decorator(func):
def wrapper(*args, **kwargs):
# 在这里添加额外的功能
print("我在func之前执行")
result = func(*args, **kwargs)
print("我在func之后执行")
return result#我返回func的返回值
return wrapper#我返回代理函数本身(这是固定写法)
@decorator
def my_function():
print("Hello, this is my function.")
# 调用my_function时,实际上调用的是wrapper函数
my_function()
# 输出:
# 我在func之前执行
# Hello, this is my function.
# 我在func之后执行
使用被代理函数参数
def decorator(func):
def wrapper(*args, **kwargs):
print("args为:",args)
print("kwargs为:",kwards)
result = func(*args, **kwargs)
return result
return wrapper
@decorator
def my_function(x, y):
return x + y
print(my_function(3, 4))
# args为: (3, 4)
# kwargs为: {}
# 7
带参数的装饰器
def repeat(num_times):
def other(func,*args,**kwargs):
for _ in range(num_times):
func(*args,**kwargs)
def dec(func):
def wrapper(*args, **kwargs):
other(func,*args)
result = None
for _ in range(num_times):
result = func(*args, **kwargs)
return result
def dec_other():
print("我是dec的其他函数")
return wrapper# 返回的是wrapper,所以执行的是wrapper
return dec # 返回的是函数dec,所以dec为代理函数。
@repeat(3)
def say_hello():
print("你好")
say_hello() # 输出六次你好!
不执行被代理函数
def decorator(func):
def wrapper(*args, **kwargs):
# 在这里添加额外的功能
print("我在func之前执行")
result = None
print("我在func之后执行")
return result
return wrapper # 我返回代理函数本身(这是固定写法)
@decorator
def my_function():
print("Hello, this is my function.")
# 调用my_function时,实际上调用的是wrapper函数
my_function()
# 输出:
# 我在func之前执行
# 我在func之后执行