当前位置: 首页 > 后端技术 > Python

python装饰器的写法

时间:2023-03-26 16:41:03 Python

装饰器一般分为装饰器方法和装饰器类。装饰器类的优点是可以继承。装饰器方法#无参数装饰器方法deffunc_decorator(func):#为了适配所有参数类型的函数#星号表示变长参数#单星号多个参数会以元组形式出现,双星号会以字典形式出现defwrapper(*args,**kwargs):print('dodecorate')func(*args,**kwargs)print('afterreturn')returnwrapper#有一个参数decorator方法#需要再包裹一层才能通过装饰器参数deffunc_decorator_with_args(level):defwrapper(func):definner_wrapper(*args,**kwargs):print('dodecorate')print('getlevel:'+str(level))func(*args,**kwargs)print('返回后')returninner_wrapperreturnwrapper@func_decoratordefmyFunc():print('myFunc')return@func_decoratordefmyFuncWithArgs(a,b):print('args:'+str(a)+''+str(b))return@func_decoratordefmyFuncWithMoreArgs(*args,**kwargs):print(args,kwargs)@func_decorator_with_args(level=1)defmyFuncTestDecoratorWithArgs():print('带参数的测试装饰器')print('无参数函数:')myFunc()print('带函数参数:')myFuncWithArgs(1,2)print('复杂函数参数:')myFuncWithMoreArgs(1,2,a=1,b=2)print('带参数的装饰器:')myFuncTestDecoratorWithArgs()输出结果:不带参数的函数:dodecoratemyFuncafterreturnhasfunctionparameters:dodecorateargs:12afterreturncomplexfunctionparameters:dodecorate(1,2){'a':1,'b':2}afterreturnwithparameterdecorator:dodecorategetlevel:1testdecoratorwithargsafterreturndecoratorclass#decoratorclassnoparameterclassclass_decorator:def__call__(self,func):defwrapper(*args,**kwargs):print('dodecorate')func(*args,**kwargs)print('afterreturn')returnwrapper#Decoratorclasswithparameterclass_decorator_with_args:级别=0def__init__(self,level):自我。level=leveldef__call__(self,func):defwrapper(*args,**kwargs):print('dodecorate')print('getlevel:'+str(self.level))func(*args,**kwargs)print('返回后')returnwrapper@class_decorator()defmyFunc():print('myFunc')return@class_decorator()defmyFuncWithArgs(a,b):print('args:'+str(a)+''+str(b))return@class_decorator()defmyFuncWithMoreArgs(*args,**kwargs):print(args,kwargs)@class_decorator_with_args(level=1)defmyFuncTestDecoratorWithArgs():打印('用args')print('noparameterfunction:')myFunc()print('withfunctionparameter:')myFuncWithArgs(1,2)print('complexfunctionparameter:')myFuncWithMoreArgs(1,2,a=1,b=2)print('decoratorwithparameters:')myFuncTestDecoratorWithArgs()输出结果:无参数function:dodecoratemyFuncafterreturnhasfunctionparameter:dodecorateargs:12afterreturncomplexfunctionparameter:dodecorate(1,2){'a':1,'b':2}afterreturnwithparameterdecorator:dodecorategetlevel:1testdecoratorwithargsafterreturn上面用到的装饰器都标注在方法上,同样的装饰器也可以用在方法上class与Java注解的区别在于,装饰器是语法糖,具有逻辑功能。Java注解只是标签,不具备处理逻辑的能力。