一些关于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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。