基础学习
菜鸟上讲的很清楚~
Python 函数装饰器
自我理解
直接代码吧
###############################【被装饰的函数, 不带参数, 无返回值】###############################
def decorator_A(func):
def wrap_func():
print("开始装饰")
func()
print("结束装饰")
return wrap_func
@decorator_A # 等价于: func_A=decorator_A(func_A)=wrap_func
def func_A():
print("AAAAA")
###############################【被装饰的函数, 带参数, 无返回值】###############################
def decorator_B(func):
def wrap_func(param1):
print("开始装饰")
func(param1)
print("结束装饰")
return wrap_func
@decorator_B # 等价于: func_A=decorator_A(func_A)=wrap_func, 即调用func_B(99)时,实际上是调用wrap_func(99) 所以wrap_func函数需要接受这个参数
def func_B(param1):
print("BBBBB", param1)
# -----延伸: 原函数无参数,wrap_func带参数(但一般不这样使用)
def decorator_C(func):
def wrap_func(param1):
print("开始装饰")
func()
print(param1)
print("结束装饰")
return wrap_func
@decorator_C
def func_C():
print("CCCCC")
# func_C() # 此时这样调用是错误的,正如上边所说,虽然函数名为func_C, 但其实调用的是wrap_func
###############################【被装饰的函数, 带参数, 有返回值】###############################
def decorator_D(func):
def wrap_func(param1):
print("开始装饰")
return_data = func(param1) # 原函数返回值
print("结束装饰")
return return_data
return wrap_func
@decorator_D
def func_D(param):
print("DDDDD")
return param
###############################【装饰器函数,带参数】###############################
# 需要在外层再加一层
def decorator_E(param1):
# 这里是对装饰器参数的一些处理,eg:
print("装饰器参数",param1)
# 以下同上
def decorator_e(func):
def wrap():
print("开始装饰")
func()
print("结束装饰")
return wrap
return decorator_e
@decorator_E("decorator_param") #等价于:@decorator_e,即相当于先decorator_E("decorator_param"),结果为decorator_e,然后@decorator_e 注:加载时就已经执行了decorator_E("decorator_param")
def func_E():
print("EEEEE")
if __name__ == "__main__":
print("-"*100)
func_A()
print("-"*100)
func_B("方法B参数")
print("-"*100)
func_C("方法C参数")
print("-"*100)
return_data = func_D("方法D参数")
print(return_data)
print("-"*100)
func_E()
结果如下:
装饰器参数 decorator_param
----------------------------------------------------------------------------------------------------
开始装饰
AAAAA
结束装饰
----------------------------------------------------------------------------------------------------
开始装饰
BBBBB 方法B参数
结束装饰
----------------------------------------------------------------------------------------------------
开始装饰
CCCCC
方法C参数
结束装饰
----------------------------------------------------------------------------------------------------
开始装饰
DDDDD
结束装饰
方法D参数
----------------------------------------------------------------------------------------------------
开始装饰
EEEEE
结束装饰
几点说明:
1、装饰器函数带参数时,会在函数加载时加载其内容,所以有了第一行的输出;
2、被修饰函数有参数时,可以以不定参数的形式传递,适用性更强;
3、为了展示,所有的例子都没有带@wrap(func)
,使用时可以加上,以保持装饰前后函数名和注释文档的一致性。