装饰器用法
代码演示:
import time
#-----------------下面是要修饰的函数带参数的写法---------------
def deco_1(func): #第一个装饰器,这里写装饰器的装饰规则
print('enter deco_1')
def wrapper(a,b):#若func是带参数的就再这里带上其参数
print('enter deco_1_wrapper')
func(a,b)
return wrapper
def deco_2(func): #第二个装饰器
print('enter deco_2')
def wrapper(a,b):
print('enter deco_2_wrapper')
func(a,b)
return wrapper
def main_1():#调用装饰器的写法,这里测试装饰器的调用顺序
@deco_1
@deco_2
def func(a,b): #这里写需要被装饰的函数
print('a+b = '+ str(a+b))
#这时候如果直接运行会print:
# enter deco_2
# enter deco_1
#注意顺序是先调用deco_2再调用deco_1
#如果要调用带装饰器的func,直接用func(a,b)即可
#
func(3,8)
#
#即func(3,8) = deco_1(deco_2(func(3,8)))
#这时候输出:
# enter deco_1_wrapper
# enter deco_2_wrapper
# a+b = 11
##############################################################
#--------------下面是带参数的装饰器写法-----------------------
def deco(judge):
if judge:
def deco_inner(func):
def wrapper(a,b):
print('我被装饰了')
func(a,b)
print('这个装饰函数结束了')
return wrapper
else:
def deco_inner(func):
return func
return deco_inner #这个return不加会报'NoneType' object is not callable
#带参数的装饰器要return两次
def main_2():#调用装饰器的写法
@deco(True) #当judge为True时,进入上面的装饰器函数
def func_1(a,b):
print('a+b = '+ str(a+b))
@deco(False) #当judge为True时,进入下面的装饰器函数
def func_2(a,b):
print('a+b = '+ str(a+b))
print('***func1结果***:')
func_1(1,2)
print('***func2结果***:')
func_2(2,4)
###############################################################
if __name__ == '__main__':
print('-------------------main_1--------------------')
main_1()
print('-------------------main_1结束了--------------')
print('-------------------main_2--------------------')
main_2()
print('-------------------main_2结束了--------------')
上面程序运行结果:
-------------------main_1--------------------
enter deco_2
enter deco_1
enter deco_1_wrapper
enter deco_2_wrapper
a+b = 11
-------------------main_1结束了--------------
-------------------main_2--------------------
***func1结果***:
我被装饰了
a+b = 3
这个装饰函数结束了
***func2结果***:
a+b = 6
-------------------main_2结束了--------------