Python中如何使用装饰器

01.什么是装饰器

把一个函数当作参数,返回一个替代版的函数
本质就是一个返回函数的函数

“在不改变原函数的基础上,给函数增加功能”

函数对修改是封闭的,对扩展是开放的

也就是说,是给一个已经写好的函数进行修改时,并不改变这个已经写好的函数,而是再写一个函数来进行调用这个函数,但是在原本已经调用过这个函数的位置不能一一修改,所以需要装饰器,装饰器需要在已经写好的函数之前写好,并在已经写好的函数之前加上语法糖,也叫糖衣语法,顾名思义,在调用此函数时,会先读取他的糖衣语法,再读取原本的函数,既满足了对函数的修改不修改原函数,又满足了调用时只是调用原函数。

import time

def decorator(func):        #装饰器,参数是一个函数
    def wrapper(*args):     #返回的一个替代版的函数
        print(time.time())  #此函数的功能是打印一个时间
        func(*args)         #执行原函数
    return wrapper

@decorator      #语法糖
def f1(func_name):
    print('This is a function ' + func_name)

@decorator
def f2(func_name1,func_name2):
    print('This is a function ' + func_name1)
    print('This is a function ' + func_name2)

f1('test')
f2('test1','test2')

示例:

import time

def decorator(func):
    def wrapper(*args):
        print(time.time())
        func(*args)
    return wrapper

@decorator
def f1(func_name):
    print('This is a function ' + func_name)

@decorator
def f2(func_name1,func_name2):
    print('This is a function ' + func_name1)
    print('This is a function ' + func_name2)

f1('test')
f2('test1','test2')

运行结果:
在这里插入图片描述
也可以加多个参数
在这里插入图片描述
在这里插入图片描述

多个装饰器

当一个函数已经有装饰器时,可以再增加另一个装饰器
示例:

def decorator_a(fun):
    print('Get in decorator_a')

    def inner_a(*args, **kwargs):
        print('Get in inner_a')
        res = fun(*args, **kwargs)
        return res

    return inner_a


def decorator_b(fun):
    print('Get in decorator_b')

    def inner_b(*args, **kwargs):
        print('Get in inner_b')
        res = fun(*args, **kwargs)
        return res

    return inner_b

def decorator_c(fun):
    print('Get in decorator_c')

    def inner_c(*args, **kwargs):
        print('Get in inner_c')
        res = fun(*args, **kwargs)
        return res

    return inner_c



@decorator_a
@decorator_b
@decorator_c
def f(x):
    print('Get in f')
    return x * 2

f(2)

运行结果:

Get in decorator_c
Get in decorator_b
Get in decorator_a
Get in inner_a
Get in inner_b
Get in inner_c
Get in f

可以看出,当函数存在多个装饰器时,会自下向上执行装饰器的壳子,自上向下执行装饰器内部。

猜你喜欢

转载自blog.csdn.net/qq_43511217/article/details/89164771