python 装饰器简单使用

首先装饰器写法

“@ + 函数名”在执行函数上方

python函数中的参数args和*kwargs的含义和用法

在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:

def some_function(*args, **kwargs):

首先,解释星号的作用,一个星号*的作用是将tuple或者list中的元素进行unpack,分开传入,作为多个参数;两个星号**的作用是把dict类型的数据作为参数传入。

装饰器具体使用

函数process1

def process1(**kwargs):
    print(kwargs)
    a = kwargs['a']
    b = kwargs['b']
    print("a+b={}".format(a+b))

执行结果:

process1(a=1,b=3)
结果1

函数set_a

def set_a(f):
    def wrapper(**kwargs):
        key = kwargs['key']
        print('start')
        print(kwargs)
        if key == 1:
            f(ccc=123,**kwargs)
        else:
            return False
        print('end')
    return wrapper

在process1上添加set_a装饰器

def set_a(f):
    def wrapper(**kwargs):
        key = kwargs['key']
        print('start')
        print(kwargs)
        if key == 1:
            f(ccc=123,**kwargs)
        else:
            return False
        print('end')
    return wrapper

@set_a
def process1(**kwargs):
    print(kwargs)
    a = kwargs['a']
    b = kwargs['b']
    print("a+b={}".format(a+b))

process1(a=1,b=3,key=1)

执行

process1(a=1,b=3,key=1)

参数key是装饰器set_a中需要用到,得到结果如下,通过装饰器set_a多传入了一个参数ccc=123


图片.png

在process1上再添加set_b装饰器


def set_a(f):
    def wrapper(**kwargs):
        key = kwargs['key']
        print('start')
        print(kwargs)
        if key == 1:
            f(ccc=123,**kwargs)
        else:
            return False
        print('end')
    return wrapper

def set_b(f):
    def wrapper(**kwargs):
        print(kwargs)
        print('start2')
        f(**kwargs,dd=2)
        print('end2')
    return wrapper

@set_a
@set_b
def process1(**kwargs):
    print(kwargs)
    a = kwargs['a']
    b = kwargs['b']
    print("a+b={}".format(a+b))

process1(a=1,b=3,key=1)

得到结果如下,通过装饰器set_a多传入了一个参数ccc=123,所有参数会传入set_b函数内,然后又多传入一个参数dd=2


图片.png
通过这个例子,得出结论:装饰器可以在函数执行前和执行后做些新的动作,并且装饰器可以多个一起使用顺序是由上到下参数可以传递。

你可能感兴趣的:(python 装饰器简单使用)