装璜器写法个别分为装璜器办法与装璜器类,装璜器类的劣势在于能够继承。

装璜器办法

#无参数装璜器办法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注解只是标记,不具备解决逻辑的能力。