Python装饰器语法糖详解:从基础到带参实现

凌晨两点半
凌晨两点半
发布时间:2026-10-11| 4人浏览过
原创

本文深入解析Python装饰器的语法糖机制,涵盖基础固定格式、使用functools.wraps保留元数据的高级写法,以及支持外部参数配置的带参装饰器实现。通过具体代码示例,展示如何优雅地扩展函数功能并处理不同场景下的装饰器需求。

Python装饰器语法糖

在Python中,装饰器是一种用于扩展函数或方法功能的强大工具,而“语法糖”则是让这种扩展更加简洁易读的语法特性。理解装饰器的固定格式、元数据保留以及带参配置,是掌握Python高级编程的关键。

基础装饰器格式

一个标准的装饰器通常由外层函数和内层函数组成。外层函数接收被装饰的函数作为参数,内层函数则定义了在调用原函数前后需要执行的操作。以下是一个基础版本的装饰器示例:

def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        ret = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return ret
    return inner

在这个结构中,timer是装饰器函数,inner是包装函数。当使用@timer装饰某个函数时,实际调用的是inner,它负责在调用原函数func前后执行额外逻辑。

使用functools.wraps保留元数据

基础装饰器虽然功能强大,但会覆盖原函数的元数据(如函数名、文档字符串等)。为了解决这个问题,Python提供了functools.wraps装饰器。它可以将原函数的元数据复制到包装函数上,确保调试和文档生成时能获取正确的信息。

from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

注意@wraps(func)必须加在最内层函数wrapper的正上方,这样才能正确地将func的元数据应用到wrapper上。

带参数的装饰器

有时我们需要装饰器本身也能接收参数,以实现更灵活的控制。这需要通过三层嵌套函数来实现:最外层接收装饰器的参数,中间层接收被装饰的函数,最内层执行实际逻辑。

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            ret = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return ret
        return inner
    return timer

@outer(True)
def func():
    return '返回值'

x=func()
print(x)

在上述代码中,@outer(True)首先调用outer(True)返回timer函数,然后timer再装饰func。通过flag参数,我们可以控制是否在函数执行前后打印额外信息。最终调用func()时,实际执行的是inner函数,并根据flag的值决定是否执行额外逻辑。

以上就是Python装饰器语法糖的详细内容,更多关于Python高级编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。