装璜器写法个别分为装璜器办法与装璜器类,装璜器类的劣势在于能够继承。
装璜器办法
#无参数装璜器办法def func_decorator(func): #为了适应全副参数类型的函数 #星号代表不定长度参数 #单星号多个参数会是元组模式,双星号为字典模式 def wrapper(*args, **kwargs): print('do decorate') func(*args, **kwargs) print('after return') return wrapper#有参数装璜器办法#须要再包一层传递装璜器参数def func_decorator_with_args(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print('do decorate') print('get level: ' + str(level)) func(*args, **kwargs) print('after return') return inner_wrapper return wrapper@func_decoratordef myFunc(): print('myFunc') return@func_decoratordef myFuncWithArgs(a,b): print('args: ' + str(a) + ' ' + str(b)) return@func_decoratordef myFuncWithMoreArgs(*args, **kwargs): print(args, kwargs)@func_decorator_with_args(level = 1)def myFuncTestDecoratorWithArgs(): print('test decorator with args')print('无参数函数:')myFunc()print('有函数参数:')myFuncWithArgs(1, 2)print('简单函数参数:')myFuncWithMoreArgs(1,2,a=1,b=2)print('带参数装璜器:')myFuncTestDecoratorWithArgs()
输入后果:
无参数函数:do decoratemyFuncafter return有函数参数:do decorateargs: 1 2after return简单函数参数:do decorate(1, 2) {'a': 1, 'b': 2}after return带参数装璜器:do decorateget level: 1test decorator with argsafter return
装璜器类
#装璜器类无参数class class_decorator: def __call__(self, func): def wrapper(*args, **kwargs): print('do decorate') func(*args, **kwargs) print('after return') return wrapper#装璜器类带参数class class_decorator_with_args: level = 0 def __init__(self, level): self.level = level def __call__(self, func): def wrapper(*args, **kwargs): print('do decorate') print('get level: ' + str(self.level)) func(*args, **kwargs) print('after return') return wrapper@class_decorator()def myFunc(): print('myFunc') return@class_decorator()def myFuncWithArgs(a,b): print('args: ' + str(a) + ' ' + str(b)) return@class_decorator()def myFuncWithMoreArgs(*args, **kwargs): print(args, kwargs)@class_decorator_with_args(level = 1)def myFuncTestDecoratorWithArgs(): print('test decorator with args')print('无参数函数:')myFunc()print('有函数参数:')myFuncWithArgs(1, 2)print('简单函数参数:')myFuncWithMoreArgs(1,2,a=1,b=2)print('带参数装璜器:')myFuncTestDecoratorWithArgs()
输入后果:
无参数函数:do decoratemyFuncafter return有函数参数:do decorateargs: 1 2after return简单函数参数:do decorate(1, 2) {'a': 1, 'b': 2}after return带参数装璜器:do decorateget level: 1test decorator with argsafter return
下面应用的装璜器都是标注在办法下面,同样装璜器也能够在类上应用。
与Java注解的区别
装璜器是语法糖,自身具备逻辑性能,Java注解只是标记,不具备解决逻辑的能力。