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

Python 装饰器:从入门到实战的完整指南

admin6个月前 (03-19)Python212

装饰器(Decorator)是 Python中一种优雅的设计模式,它允许我们在不修改原函数代码的前提下,动态地添加功能。想象一下,你有一个已经写好的函数,现在需要为它添加日志记录、性能监控、权限验证等功能,但又不想改动函数本身的代码——这时候装饰器就派上用场了。

从技术层面讲,装饰器本质上是一个接收函数作为参数并返回新函数的高阶函数。让我们通过代码来逐步理解。

一、装饰器的基础语法

最基础的装饰器结构如下:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("函数执行前")
        result = func(*args, **kwargs)
        print("函数执行后")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("World")

这里的 @my_decorator语法糖等价于 say_hello = my_decorator(say_hello)。关键在于理解 wrapper函数——它包裹了原始函数,可以在调用前后插入任意逻辑。

二、带参数的装饰器

实际应用中,我们经常需要给装饰器本身传递参数。这需要再增加一层函数嵌套:

def repeat(times):
    """重复执行函数的装饰器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(times):
                print(f"第 {i   1}次执行:")
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def greet(message):
    print(message)

greet("你好!")

注意三层函数的关系:repeat接收装饰器参数,返回真正的装饰器 decorator,decorator接收被装饰函数,返回 wrapper。

三、实用案例:性能监控装饰器

让我们创建一个能测量函数执行时间的装饰器,这在性能优化中非常有用:

import time
from functools import wraps

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

这里使用了 functools.wraps,它是一个重要的细节——没有它,装饰后的函数会丢失原始的 __name__和 __doc__等信息。

四、实战:缓存装饰器

缓存是装饰器的经典应用场景。对于计算密集型且结果确定的函数,缓存可以大幅提升性能:

from functools import wraps

def memoize(func):
    cache = {}
    @wraps(func)
    def wrapper(*args):
        key = str(args)
        if key not in cache:
            cache[key] = func(*args)
        return cache[key]
    return wrapper

五、类装饰器

装饰器不仅可以装饰函数,还可以装饰类。类装饰器接收一个类并返回一个新类。

六、装饰器栈

Python允许对同一个函数应用多个装饰器,它们会按照从下到上的顺序执行。

总结

装饰器是 Python中强大的元编程工具,掌握它可以让你写出更优雅、更可维护的代码。关键是要理解其本质——装饰器就是接收函数并返回新函数的高阶函数。

相关文章

Python 上下文管理器实战:从 with 语句到自定义资源管理

在 Python 编程中,上下文管理器(Context Manager)是一个强大但常被低估的特性。当你使用 open() 函数读取文件时,那个熟悉的 with 语句背后,正是上下文管理器在默默工作。...

Python 装饰器完全指南:从原理到实战的 5 个核心场景

装饰器(Decorator)是 Python 中最具魅力的特性之一。它允许我们在不修改原函数代码的前提下,动态地添加功能。但很多开发者对装饰器的理解仅停留在在函数上面加个@符号的层面。今天,我们将从底...

Python 装饰器的 5 个实用场景:从入门到精通

装饰器(Decorator)是 Python 中的"函数包装器",它允许我们在不修改原函数代码的前提下,动态地添加功能。很多初学者学完 @decorator 语法后就止步不前,但实际上装饰器在实际工程...

Python 中利用 functools.lru_cache 实现高效缓存:从入门到进阶

Python 中利用 functools.lru_cache 实现高效缓存:从入门到进阶 在日常 Python 开发中,我们经常会遇到重复计算相同输入的问题,比如递归计算斐波那契数列、多次调用相同参...

Python 生成器进阶:理解 yield 与构建高效迭代器

在 Python 开发中,我们经常需要处理大量数据或流式数据,如果一次性将所有数据加载到内存中,不仅会占用大量内存空间,还可能导致程序运行缓慢甚至崩溃。生成器(Generator)正是解决这个问题的利...

Python 装饰器进阶:从入门到实战,写出更灵活的函数增强技巧

# Python 装饰器进阶:从入门到实战,写出更灵活的函数增强技巧 ## 简介 很多 Python 开发者都听过装饰器,也知道怎么写简单的装饰器。但大多数人对装饰器的进阶用法,比如带参数的装饰器、...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。