python装饰器相当于函数的调用方式
1.普通装饰器
importlogging
1.foo=use_loggine(foo)
defuse_loggine(func):
defwrapper():
logging.warn("%sisrunning"%func.__name__)
returnfunc()
returnwrapper
@use_loggine
deffoo():
print"aaa"
foo()
printfoo.__name__
2.func需要参数:
foo=use_loggine(foo)第一个参数就是func这个函数对象,不包含参数foo(params)
defuse_loggine(func):
defwrapper(name):
logging.warn("%sisrunning"%func.__name__)
returnfunc(name)
returnwrapper
@use_loggine
deffoo(name):
print"nameis%s"%name
3.装饰器带参数
foo=use_logging('warn')(foo)还是把被装饰的函数当做参数赋给装饰器
defuse_logging(level):
defdecorator(func):
defwrapper(*args,**kwargs):
iflevel=='warn':
logging.warn("%sisrunning"%func.__name__)
eliflevel=='info':
logging.warn("%sisrunning"%func.__name__)
returnfunc(*args)
returnwrapper
returndecorator
@use_logging('warn')
deffoo(name):
print"iam%s"%name
foo=use_logging('warn')(foo)
printfoo.__name__
foo('foo')
4.类装饰器,还是把被装饰的函数当做参数赋给装饰器
foo=Foo(params)(func)
classFoo(object):
def__init__(self,name):
self.name=name
def__call__(self,func):
defaa():
print"classdecoratorrunning"
print"nameis:%s"%self.name
func()
print'classdecoratorending'
returnaa
@Foo("hello")
defbar():
print"world"
bar()
@deco
deffoo()
pass
foo=deco(foo)
@deco(xx)
deffoo():
pass
foo=deco(xx)(foo)
5.类方法装饰器
类方法装饰器和其他装饰器没有什么区别,只不过在装饰器内部返回的函数中,第一个参数是固定的,是调用方法的对象本身,如
果是实例对象,就是self,是类方法的话,就是cls,静态方法的话,没有第一个参数。
fromfunctoolsimportwraps
defmethod_decor(func):
@wraps(func)
defwrapper(*args,**kwargs):
try:
u=func(*args,**kwargs)
returnu
exceptExceptionase:
args[0].bb()#args[0]就是self或者cls。可以在args前面定义self,更加方便u=func(self,*args,**kwargs)
return'anExceptionraised.'
returnwrapper
classFoo(object):
@method_decor
defaa(self):
#print("Thisiswrapedmethod")
raiseException('aa')
defbb(self):
print("Thisiscalledmethod")
a=Foo()
a.aa()
以上这篇python装饰器相当于函数的调用方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。