实现python装饰器的方法
小编给大家分享一下实现python装饰器的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1、装饰器的理解
装饰器是将一个函数镶嵌在另一个函数中进行重复使用的目的,不改变其结构,增加函数的使用方式,但是不用写过多冗余的代码;
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
通常用到的功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存
2、实现原理与通用写法
咱们可以从一个简单的记录函数运行时间的简单装饰器,举一反三,推导出一个通用的装饰器写法
importtimedeftimer(func):'''记录方法运行时间的装饰器:paramfunc:方法:return:函数对象'''defdeco(*args,**kwargs):startTime=time.time()f=func(*args,**kwargs)endTime=time.time()msecs=(endTime-startTime)*1000print("timeis%dms"%msecs)returnf#如果func有返回值得话,需要在此return回去,否则,默认返回值为None,一般默认都返回returndeco@timerdeftest(parameter):print("testisrunning!")time.sleep(1)return"Returnedvalue"#该函数有返回值,所以需要在装饰器中的deco方法中写返回值t=test('aa')print(t)
python学习网,免费的python学习网站,欢迎在线学习!
这是一个很简单的通用的记录时间的装饰器,从而推导出一个通用的装饰器写法:
deffunc_name(func):#自定义装饰器函数名defdeco(*args,**kwargs):#将所有参数原封不动的进行传递print("在这个分割线之上写函数运行前的操作")#-----------分割线-----------f=func(*args,**kwargs)#-----------分割线-----------print("在这个分割线之后,return之前,写函数运行后的操作")returnf#如果func有返回值得话,需要在此return回去,否则,默认返回值为None,一般默认都返回returndeco@func_namedeftest(parameter):#8print("testisrunning!")time.sleep(1)return"Returnedvalue"#该函数有返回值,所以需要在装饰器中的deco方法中写返回值t=test('aa')print(t)
ok 装饰器到此可以完事了,一般情况下都能满足需求了,网上看那么多原理,有点儿浪费时间,我偏向实操型,实在不喜欢啰嗦那么多,就是干。
当然在开发过程中, 我们可能会遇到一些特殊情况,比如参数问题
1、给装饰器函数代参数(通用)
2、将执行函数的参数拆分计算等(比如:1000w的数据,拆分成100份执行等)(定制)
那就按顺序来
1、写一个代参数的装饰器
deflogging(level):defwrapper(func):definner_wrapper(*args,**kwargs):print("[{level}]:enterfunction{func}()".format(level=level,func=func.__name__))returnfunc(*args,**kwargs)returninner_wrapperreturnwrapper@logging(level='INFO')defsay(something):print("say{}!".format(something))#如果没有使用@语法,等同于#say=logging(level='INFO')(say)@logging(level='DEBUG')defdo(something):print("do{}...".format(something))if__name__=='__main__':say('hello')do("mywork")
以上是实现python装饰器的方法的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。