0

0

Python装饰器带参数_多层装饰器实现方式

舞夢輝影

舞夢輝影

发布时间:2026-03-09 16:43:56

|

543人浏览过

|

来源于php中文网

原创

带参数的装饰器本质是返回装饰器的函数,需三层嵌套:外层接收参数,中层接收函数,内层执行逻辑;多层装饰器按由下至上顺序应用,即f = dec1(dec2(f))。

python装饰器带参数_多层装饰器实现方式

带参数的装饰器本质是“装饰器工厂”

Python中带参数的装饰器,实际是一个返回装饰器的函数。它接收参数,内部定义真正的装饰器,再返回这个装饰器。关键在于三层嵌套:外层接收装饰器参数,中层接收被装饰函数,内层执行逻辑。

例如,实现一个可配置重试次数的装饰器:

def retry(max_attempts=3):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if i == max_attempts - 1:
                        raise e
            return None
        return wrapper
    return decorator
<p>@retry(max_attempts=5)
def fetch_data():</p><h1>模拟可能失败的操作</h1><pre class='brush:python;toolbar:false;'>pass

多层装饰器的执行顺序是“由下至上、由右至左”

当多个装饰器叠加使用时(如 @dec1
@dec2
def f():),Python先应用最靠近函数的装饰器(@dec2),再将结果传给上一层(@dec1)。即:f = dec1(dec2(f))

常见组合场景与建议:

聚蜂消防BeesFPD
聚蜂消防BeesFPD

关注消防领域的智慧云平台

下载

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

  • 日志 + 权限校验 + 缓存:通常把缓存放在最外层(减少重复计算),权限校验次之(早拦截非法调用),日志最内层或根据需要调整位置
  • 注意副作用叠加:比如两个装饰器都修改了 func.__name__func.__doc__,需用 @functools.wraps(func) 保证元信息不丢失
  • 调试时可在各层 wrapper 中加 print 观察调用流,验证执行顺序

带参数 + 多层装饰器的典型写法

组合使用时,每层带参装饰器都要保持三层结构;多层之间互不影响,但要注意参数作用域和闭包绑定。

示例:同时使用带参的日志装饰器和带参的超时控制:

def log_calls(level='INFO'):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print(f"[{level}] Calling {func.__name__}")
            result = func(*args, **kwargs)
            print(f"[{level}] Done {func.__name__}")
            return result
        return wrapper
    return decorator
<p>def timeout(seconds=5):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, *<em>kwargs):
import signal
def timeout_handler(signum, frame):
raise TimeoutError(f"{func.<strong>name</strong>} timed out after {seconds}s")
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(seconds)
try:
result = func(</em>args, **kwargs)
return result
finally:
signal.alarm(0)
signal.signal(signal.SIGALRM, old_handler)
return wrapper
return decorator</p><p>@log_calls(level='DEBUG')
@timeout(seconds=2)
def slow_function():
import time
time.sleep(3)  # 将触发超时</p>

实用技巧与避坑点

  • 务必在每一层 wrapper 中使用 @functools.wraps(func),否则被装饰函数的 __name____doc__ 等会丢失
  • 带参装饰器的参数不能是可变对象(如 listdict)作为默认值,避免跨调用污染
  • 如果装饰器需支持类方法、静态方法,注意 selfcls 参数位置,必要时用 inspect.signature 做适配
  • 单元测试装饰器逻辑时,可直接调用中间层(如 retry(3)(my_func))绕过语法糖,更易断言

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

151

2025.07.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

148

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

273

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

93

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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