关于python:python装饰器的编写

8次阅读

共计 2169 个字符,预计需要花费 6 分钟才能阅读完成。

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

装璜器办法

# 无参数装璜器办法
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_decorator
def myFunc():
    print('myFunc')
    return

@func_decorator
def myFuncWithArgs(a,b):
    print('args:' + str(a) + ' ' + str(b))
    return

@func_decorator
def 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 decorate
myFunc
after return
有函数参数:
do decorate
args: 1 2
after return
简单函数参数:
do decorate
(1, 2) {'a': 1, 'b': 2}
after return
带参数装璜器:
do decorate
get level: 1
test decorator with args
after 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 decorate
myFunc
after return
有函数参数:
do decorate
args: 1 2
after return
简单函数参数:
do decorate
(1, 2) {'a': 1, 'b': 2}
after return
带参数装璜器:
do decorate
get level: 1
test decorator with args
after return

下面应用的装璜器都是标注在办法下面,同样装璜器也能够在类上应用。

与 Java 注解的区别

装璜器是语法糖,自身具备逻辑性能,Java 注解只是标记,不具备解决逻辑的能力。

正文完
 0