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

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

本文深入解析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 相关产品和应用

全部下载

专题列表