Python 装饰器:5 分钟快速理解

核心原理

装饰器本质上是高阶函数,其核心机制是:

  1. 接受一个函数作为输入
  2. 返回一个新函数作为输出
  3. 在不修改原函数代码的前提下增强功能

用数学表示函数变换过程: $$f_{decorated} = \text{decorator}(f_{original})$$

基础用法示例
# 定义装饰器
def simple_decorator(func):
    def wrapper():
        print("函数执行前")
        func()  # 调用原函数
        print("函数执行后")
    return wrapper

# 使用装饰器
@simple_decorator
def greet():
    print("Hello!")

# 调用被装饰的函数
greet()

输出结果

函数执行前
Hello!
函数执行后

关键特性
  1. 语法糖@decorator 等价于 func = decorator(func)
  2. 叠加使用:支持多个装饰器
    @decorator1
    @decorator2
    def func(): ...
    

  3. 参数传递:处理带参数的函数
    def universal_decorator(func):
        def wrapper(*args, **kwargs):
            print("参数处理")
            return func(*args, **kwargs)
        return wrapper
    

实用场景
  1. 性能监控(计时器):

    import time
    def timer(func):
        def wrapper(*args):
            start = time.time()
            result = func(*args)
            print(f"耗时: {time.time()-start:.4f}秒")
            return result
        return wrapper
    

  2. 权限验证

    def login_required(func):
        def wrapper(user):
            if user.is_authenticated:
                return func(user)
            else:
                raise PermissionError("请先登录")
        return wrapper
    

进阶技巧
  • 带参数的装饰器:创建返回装饰器的函数
    def repeat(n):  # 装饰器工厂
        def decorator(func):
            def wrapper(*args):
                for _ in range(n):
                    func(*args)
            return wrapper
        return decorator
    

理解要点
  1. 装饰器在函数定义时立即执行
  2. wrapper 函数应使用 functools.wraps 保留原函数信息
  3. 类也可以作为装饰器(需实现 __call__ 方法)

通过这种机制,只需添加一行 @decorator 就能实现功能扩展,大幅提升代码复用性和可维护性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐