装饰器
Posted liuhongshuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
1,简单的装饰器
装饰器
语法糖 @
本质 一个闭包函数
功能 不改变原函数及其调用方式 对原函数功能进行扩展
开放封闭原则:多扩展开放 对修改封闭
#装饰器 不改变原函数的调用方式 并在函数前后添加功能 #开放封闭原则:多扩展开放 对修改封闭 # import time # def timer(func): # def inner(): # start_time=time.time() # ret=func()#res=func1()-->res=‘---end---‘ # end_time=time.time() # print(end_time-start_time) # return ret # return inner # # @timer#func1=timer(func1)-->inner # def func1(): # print(‘===========‘) # time.sleep(0.5) # print(‘**********‘) # return ‘---end---‘ # # res=func1()#inner() # print(res)
2,带参数的装饰器
#带参数的装饰器 # import time # def timer(func): # def inner(*args,**kwargs): # start_time=time.time() # ret=func(*args,**kwargs)#res=func1(1,2,3)-->‘---end---‘ # end_time=time.time() # print(end_time-start_time) # return ret # return inner # # @timer#func1=timer(func1)-->inner #语法糖 # def func1(a,b,c): # print(‘===========‘,a,b) # time.sleep(0.5) # print(‘**********‘,c) # return ‘---end---‘ # # res=func1(1,2,c=3)#inner(1,2,c=3) # print(res)
3,装饰器的固定格式
#装饰器的固定格式 # def wrapper(func): # def inner(*args,**kwargs): # #在被装饰函数之前要做的事 # res=func(*args,**kwargs) # #在被装饰函数之后要做的事 # return res # return inner
4,wraps版装饰器(为了不让原函数的一些信息失效)
#wraps版本 # from functools import wraps # def wrapper(func): # @wraps(func) # def inner(*args,**kwargs): # #在被装饰函数之前要做的事 # res=func(*args,**kwargs) # #在被装饰函数之后要做的事 # return res # return inner # @wrapper#func=wrapper(func)-->inner # def func(): # ‘‘‘ # wraps 使函数保留原本的信息 # ‘‘‘ # print(‘welcome‘) # return ‘----end----‘ # # res=func()#inner() # print(res) # print(func.__name__)#查看函数名 # print(func.__doc__)#查看注释信息
5,装饰器的控制
#装饰器的控制与终止 # import time # FLAG=False # def time_out(flag): # def timer(func): # def inner(*args,**kwargs): # if flag: # start_time=time.time() # res=func(*args,**kwargs)#res=func1(1,2,3)-->‘---end---‘ # end_time=time.time() # print(end_time-start_time) # return res # else: # res=func(*args,**kwargs) # return res # return inner # return timer # @time_out(FLAG)# @timer-->func1=timer(func1)-->inner # def func1(a,b,c): # print(‘===========‘,a,b) # time.sleep(0.5) # print(‘**********‘,c) # return ‘---end---‘ # # res=func1(1,2,c=3)#inner(1,2,c=3) # print(res)
6,多个装饰器装饰同一个函数
#多个装饰器装饰同一个函数(俄罗斯套娃) # def wrapper1(func): # def inner1(): # print(‘wrapper1,before func‘) # res=func()#inner2() # print(‘wrapper1,after func‘) # return res # return inner1 # # def wrapper2(func): # def inner2(): # print(‘wrapper2,before func‘) # res=func()#func() # print(‘wrapper2,after func‘) # return res # return inner2 # # @wrapper1#func=wrapper1(func)-->wrapper1(inner2)-->inner1 # @wrapper2#func=wrapper2(func)-->inner2 # def func(): # print(‘in func‘) # return ‘---end---‘ # # res=func()#inner1() # print(res)
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章