装饰器的概念

Python 的装饰器(Decorator)是一种用于修改或扩展原有函数功能的语法糖。它可以在不改变原函数代码的情况下,通过将函数作为参数传递给另一个函数来实现函数的增强。

装饰器是一个闭包函数,通过接收一个函数作为参数,并返回一个新的函数对象来对该函数进行扩展。在返回的新函数中,我们可以添加额外的代码、执行前/后的处理、异常处理、缓存数据等功能。

常见的 Python 装饰器的使用场景包括:

  • 记录函数运行时间、调用次数等统计信息
  • 实现函数的授权、身份验证等访问控制功能
  • 实现函数输入输出参数的类型检查、校验、转换等
  • 动态地修改函数的调用方式、返回值、异常处理等
  • 实现缓存机制,提高函数的执行效率

使用代码实现以及理解

实现1(这里的装饰器在fun上面@的时候仅仅有一个参数fun)

def dec(func):
    # 这个函数接受的参数来自fun
    def wrapper(*args):
        print("wrapper", args)
        # 我们必须自己调用 func,因此装饰器对应的函数的逻辑等的调用全部集中在了这里
        return func(*args) # 返回 func 函数的返回值

    return wrapper


# 一般情况下,装饰器仅仅有下面的这个fun来作为参数
@dec
def fun(*args):
    print("call fun", args)
    return sum(args)


# 调用被装饰器装饰的函数,这点的逻辑
print(fun(1, 2, 3))

实现2(这里的装饰器在fun上面@传递自己的参数

def dec_params(*args, **kw):
    print(args, kw)

    def dec(func):
        # 这个函数接受的参数来自fun
        def wrapper(*args_fun):
            print("wrapper", args_fun)
            # 我们必须自己调用 func 因此装饰器对应的函数的逻辑等的调用全部集中在了这里
            return func(*args_fun)

        return wrapper

    return dec


# 给装饰器函数传参数
@dec_params(1, 2, 3)
def fun(*args):
    print("call fun", args)
    # 计算 args 的和
    return sum(args)


print(fun(-1, 1))