一些关于python 装饰器的个人理解
装饰器
本质是一个接受参数为函数的函数。
作用:为一个已经实现的方法添加额外的通用功能,比如日志记录、运行计时等。
举例
1.不带参数的装饰器,不用@
#不带参数的装饰器 defdeco_test(func): defwrapper(*args,**kwargs): print("beforefunction") f=func(*args,**kwargs) print("afterfunction") returnf returnwrapper defdo_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) returna if__name__=='__main__': #不用@ f=deco_test(do_something)("1","2","3")
输出:
beforefunction
1
2
3
afterfunction
个人理解:
相当于在do_something函数外面套了两个输出:beforefunction和afterfunction。
2.不带参数的装饰器,用@
#不带参数的装饰器 defdeco_test(func): defwrapper(*args,**kwargs): print("beforefunction") f=func(*args,**kwargs) print("afterfunction") returnf returnwrapper @deco_test defdo_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) returna if__name__=='__main__': #使用@ f=do_something("1","2","3")
输出:
beforefunction
1
2
3
afterfunction
个人理解:
相当于执行do_something函数的时候,因为有@的原因,已经知道有一层装饰器deco_test,所以不需要再单独写deco_test(do_something)了。
3.带参数的装饰器
#带参数的装饰器 deflogging(level): defwrapper(func): definner_wrapper(*args,**kwargs): print("[{level}]:enterfunction{func}()".format(level=level,func=func.__name__)) f=func(*args,**kwargs) print("afterfunction:[{level}]:enterfunction{func}()".format(level=level,func=func.__name__)) returnf returninner_wrapper returnwrapper @logging(level="debug") defdo_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) returna if__name__=='__main__': #使用@ f=do_something("1","2","3")
输出:
[debug]:enterfunctiondo_something()
1
2
3
afterfunction:[debug]:enterfunctiondo_something()
个人理解:
装饰器带了一个参数level="debug"。
最外层的函数logging()接受参数并将它们作用在内部的装饰器函数上面。内层的函数wrapper()接受一个函数作为参数,然后在函数上面放置一个装饰器。这里的关键点是装饰器是可以使用传递给logging()的参数的。
4.类装饰器
#类装饰器 classdeco_cls(object): def__init__(self,func): self._func=func def__call__(self,*args,**kwargs): print("classdecoratorbeforefunction") f=self._func(*args,**kwargs) print("classdecoratorafterfunction") returnf @deco_cls defdo_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) returna if__name__=='__main__': #使用@ f=do_something("1","2","3")
输出:
classdecoratorbeforefunction
1
2
3
classdecoratorafterfunction
个人理解:
使用一个装饰器去包装函数,返回一个可调用的实例。因此定义了一个类装饰器。
5.两层装饰器
#不带参数的装饰器 defdeco_test(func): defwrapper(*args,**kwargs): print("beforefunction") f=func(*args,**kwargs) print("afterfunction") returnf returnwrapper #带参数的装饰器 deflogging(level): defwrapper(func): definner_wrapper(*args,**kwargs): print("[{level}]:enterfunction{func}()".format(level=level,func=func.__name__)) f=func(*args,**kwargs) print("afterfunction:[{level}]:enterfunction{func}()".format(level=level,func=func.__name__)) returnf returninner_wrapper returnwrapper @logging(level="debug") @deco_test defdo_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) returna if__name__=='__main__': #使用@ f=do_something("1","2","3")
输出:
[debug]:enterfunctionwrapper()
beforefunction
1
2
3
afterfunction
afterfunction:[debug]:enterfunctionwrapper()
个人理解:
在函数do_something()外面先套一层deco_test()装饰器,再在最外面套一层logging()装饰器。
以上就是python装饰器的一些个人理解的详细内容,更多关于python装饰器的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。