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

Python装饰器完全指南 - 从基础到高级用法详解

Python装饰器完全指南

掌握Python装饰器的各种用法与高级技巧,提升代码质量和开发效率

最后更新: 2023年10月15日 阅读时间: 15分钟

装饰器基础

装饰器是修改其他函数功能的函数,使代码更简洁、可重用。

简单装饰器

基本装饰器示例
def simple_decorator(func):
    def wrapper():
        print("函数执行前操作")
        func()
        print("函数执行后操作")
    return wrapper

@simple_decorator
def say_hello():
    print("Hello!")

# 调用函数
say_hello()

装饰器使用@语法糖,使代码更清晰易读,等同于 say_hello = simple_decorator(say_hello)

带参数装饰器

装饰器可以接受参数,增加装饰器的灵活性和复用性。

带参数的装饰器

参数化装饰器示例
def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat

@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}")

greet("Alice")

带参数装饰器需要三层嵌套函数:参数接收层、装饰器接收层和包装函数层

类装饰器

使用类实现装饰器,可以更好地管理状态和提供更复杂的功能。

类作为装饰器

类装饰器示例
class CountCalls:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0
    
    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f"执行 {self.func.__name__} 第 {self.num_calls} 次")
        return self.func(*args, **kwargs)

@CountCalls
def say_hello():
    print("Hello!")

say_hello()
say_hello()

类装饰器通过实现__call__方法使实例可调用,从而保留状态信息

高级装饰器技术

保留元信息的装饰器

使用functools.wraps保留原始函数的元信息

保留元信息示例
import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("装饰器操作")
        return func(*args, **kwargs)
    return wrapper

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

print("函数名:", example.__name__)
print("文档:", example.__doc__)

装饰器类

使用装饰器类实现更复杂的功能

装饰器类示例
class Debugger:
    def __init__(self, active=True):
        self.active = active
    
    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            if self.active:
                print(f"调用函数: {func.__name__}")
                print(f"参数: args={args}, kwargs={kwargs}")
            result = func(*args, **kwargs)
            if self.active:
                print(f"返回值: {result}")
            return result
        return wrapper

@Debugger(active=True)
def add(a, b):
    return a + b

add(3, 5)

多个装饰器

多个装饰器可以堆叠使用,执行顺序从下往上

多个装饰器示例
def decorator1(func):
    def wrapper():
        print("装饰器1 - 前")
        func()
        print("装饰器1 - 后")
    return wrapper

def decorator2(func):
    def wrapper():
        print("装饰器2 - 前")
        func()
        print("装饰器2 - 后")
    return wrapper

@decorator1
@decorator2
def my_function():
    print("核心函数")

my_function()

多个装饰器堆叠时,最靠近函数的装饰器最先执行(装饰器2先于装饰器1)

装饰器的实际应用

装饰器在Python开发中广泛应用,以下是一些常见场景:

日志记录

自动记录函数调用信息、参数和返回值

性能测试

测量函数执行时间,优化代码性能

权限验证

检查用户权限后再执行函数

缓存机制

缓存函数结果,提高重复计算效率

掌握装饰器技术可以大幅提高代码的可维护性、可读性和复用性,是Python高级编程的核心技能之一。

© 2023 Python装饰器完全指南 | 本教程仅供学习参考

发表评论