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