当前位置:首页 > Python > 正文

Python函数装饰器应用教程 - 从入门到精通

Python函数装饰器应用教程

掌握装饰器的核心概念与实际应用

什么是函数装饰器?

函数装饰器是Python中一种强大的语法特性,它允许你在不修改原函数代码的情况下,为函数添加额外的功能。装饰器本质上是一个接受函数作为参数并返回一个新函数的可调用对象。

装饰器的优势

  • 代码复用性高
  • 增强函数功能而不修改原函数
  • 遵循开放封闭原则
  • 使代码更简洁优雅

常见应用场景

  • 日志记录
  • 性能测试
  • 权限验证
  • 缓存结果
  • 输入验证

装饰器基本语法

装饰器使用@符号加装饰器名称,放置在函数定义上方:

@decorator
def my_function():
    # 函数体
    pass

上面的代码等价于:

def my_function():
    # 函数体
    pass

my_function = decorator(my_function)

装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新函数。

装饰器应用实例

1. 计时装饰器

测量函数执行时间:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        print(f"函数 {func.__name__} 执行耗时: {end_time - start_time:.6f} 秒")
        return result
    return wrapper

@timer_decorator
def long_running_function(n):
    """模拟耗时操作"""
    sum = 0
    for i in range(n):
        sum += i
    return sum

# 调用函数
result = long_running_function(1000000)
print(f"计算结果: {result}")

2. 日志记录装饰器

记录函数调用信息:

def logger_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"开始执行: {func.__name__}()")
        print(f"参数: args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"函数 {func.__name__}() 执行完成")
        return result
    return wrapper

@logger_decorator
def add_numbers(a, b):
    return a + b

@logger_decorator
def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"

# 调用函数
print(add_numbers(3, 5))
print(greet("Alice", greeting="Hi"))

3. 权限验证装饰器

实现简单的访问控制:

def requires_auth(role="user"):
    def decorator(func):
        def wrapper(*args, **kwargs):
            # 在实际应用中,这里会检查用户权限
            print(f"验证权限: 需要 {role} 角色")
            # 模拟权限验证
            if role == "admin":
                print("权限验证成功: 管理员用户")
                return func(*args, **kwargs)
            else:
                print("权限验证失败: 权限不足")
                return None
        return wrapper
    return decorator

@requires_auth(role="admin")
def delete_database():
    print("数据库删除中...")
    return "数据库已成功删除"

@requires_auth(role="user")
def view_profile(user_id):
    return f"显示用户 {user_id} 的个人资料"

# 调用函数
print(delete_database())
print(view_profile(123))

高级装饰器技巧

保留函数元数据

使用functools.wraps保留原函数的元数据:

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        """包装函数文档字符串"""
        print(f"调用函数: {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def example():
    """示例函数文档字符串"""
    print("示例函数执行")

# 测试元数据
print(example.__name__)  # 输出: example
print(example.__doc__)   # 输出: 示例函数文档字符串

多个装饰器叠加使用

装饰器可以叠加使用,执行顺序从下往上:

def decorator1(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Decorator 1 - 前")
        result = func(*args, **kwargs)
        print("Decorator 1 - 后")
        return result
    return wrapper

def decorator2(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Decorator 2 - 前")
        result = func(*args, **kwargs)
        print("Decorator 2 - 后")
        return result
    return wrapper

@decorator1
@decorator2
def my_function():
    print("函数执行中")

# 调用函数
my_function()

# 输出顺序:
# Decorator 1 - 前
# Decorator 2 - 前
# 函数执行中
# Decorator 2 - 后
# Decorator 1 - 后

总结

Python装饰器是增强函数功能的强大工具,其核心要点包括:

  • 装饰器是接受函数并返回函数的高阶函数
  • 使用@decorator_name语法应用装饰器
  • 装饰器可以带参数实现更灵活的功能
  • 使用functools.wraps保留函数元数据
  • 多个装饰器可以堆叠使用,从下往上执行

掌握装饰器能让你写出更简洁、优雅且功能强大的Python代码,尤其在框架开发、API设计和功能增强方面非常有用。

发表评论