Python装饰器参数怎么传递_带参数装饰器示例解析【教程】

冰川箭仙
发布: 2025-12-20 21:39:07
原创
356人浏览过
带参数的装饰器本质是“装饰器工厂”,需三层嵌套:外层接收装饰器参数并返回中层函数,中层接收被装饰函数并返回内层函数,内层接收调用参数、执行逻辑并返回原函数结果;漏掉任一层return将导致TypeError或返回None。

python装饰器参数怎么传递_带参数装饰器示例解析【教程】

带参数的装饰器本质是“装饰器工厂”,它先接收参数,再返回一个真正的装饰器函数。关键在于多一层函数嵌套:外层接收装饰器参数,中层接收被装饰函数,内层执行实际逻辑。

装饰器参数传递的三层结构

带参数装饰器必须有三层嵌套函数:

  • 最外层:接收装饰器本身的参数(如@log(level='INFO')里的level),返回中层函数
  • 中层:接收被装饰的函数对象(func),返回内层函数
  • 内层:接收被装饰函数的调用参数(*args, **kwargs),执行前置/后置逻辑,并调用原函数

一个实用的带参日志装饰器

下面是一个记录执行级别和函数名的日志装饰器:

def log(level='INFO'):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f'[{level}] Calling {func.__name__}')
            result = func(*args, **kwargs)
            print(f'[{level}] {func.__name__} finished')
            return result
        return wrapper
    return decorator
<p>@log('DEBUG')  # 传入装饰器参数 'DEBUG'
def greet(name):
return f'Hello, {name}!'</p><p>print(greet('Alice'))
登录后复制

输出为:

立即学习Python免费学习笔记(深入)”;

[DEBUG] Calling greet
[DEBUG] greet finished
Hello, Alice!
登录后复制

为什么不能直接在中层接收装饰器参数?

因为 Python 解析@log('DEBUG')时,会立即调用log('DEBUG'),期望它返回一个可调用对象(即真正的装饰器)。如果log没有外层,它就只能接收func,无法拿到'DEBUG'——此时@log('DEBUG')等价于log('DEBUG')(func),而log('DEBUG')必须返回一个能接收func的函数。

Content at Scale
Content at Scale

SEO长内容自动化创作平台

Content at Scale 154
查看详情 Content at Scale

带参装饰器配合 functools.wraps 保持元信息

不加@wraps会导致被装饰函数的__name____doc__丢失。正确写法:

from functools import wraps
<p>def log(level='INFO'):
def decorator(func):
@wraps(func)  # 修复函数元信息
def wrapper(*args, *<em>kwargs):
print(f'[{level}] {func.<strong>name</strong>} start')
return func(</em>args, **kwargs)
return wrapper
return decorator
登录后复制

这样greet.__name__仍是'greet',而非'wrapper'

常见错误:漏掉某一层 return

容易出错的点:

  • 外层忘了return decorator → 报错:TypeError: 'NoneType' object is not callable
  • 中层忘了return wrapper → 原函数调用返回None,逻辑中断
  • 内层忘了return func(...) → 装饰后函数永远返回None

记住:每一层函数体末尾都要有明确的return,且返回值类型要匹配调用预期。

以上就是Python装饰器参数怎么传递_带参数装饰器示例解析【教程】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号