新闻中心

python带参数的装饰器怎么写?

2025-11-21
浏览次数:
返回列表
带参数的装饰器是返回装饰器的函数,需三层嵌套:外层接收参数,中间层接收函数,内层执行逻辑并调用原函数。如logger(level)可控制日志级别,配合functools.wraps保留函数元信息;retry(max_attempts)示例展示异常重试机制,结构清晰且实用。

python带参数的装饰器怎么写?

带参数的装饰器其实是一个返回装饰器的函数。也就是说,它外层多了一层函数包装,用来接收参数。

基本结构说明

要写一个带参数的装饰器,你需要三层嵌套函数:

  • 最外层函数:接收装饰器的参数
  • 中间层函数:接收被装饰的函数
  • 最内层函数:实际执行逻辑,可以调用原函数并添加额外行为

示例:一个记录日志级别的装饰器

比如你想控制打印日志的级别(info、warning等):

def logger(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"[{level.upper()}] 正在执行 {func.__name__}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

# 使用
@logger("info")
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("Alice")

输出:

crmeb电商系统 crmeb电商系统

CRMEB 是基于Thinkphp5基础开发的以会员为中心的电商系统,开源版微信公众号商城和小程序商城数据同步,带积分、优惠券、秒杀、砍价、分销等功能,更是一套方便二次开发的商城框架(后台封装了独有快速创建表单功能,无需写表单页面、快速创建数据搜索和数据列表页、导出表格、系统权限配置控制每一个控制器方法、系统参数配置、数据字典、组合数据等)

crmeb电商系统 0 查看详情 crmeb电商系统
[INFO] 正在执行 say_hello
Hello, Alice!

使用 functools.wraps 保留原函数信息

为了不丢失原函数的元数据(如 __name__、__doc__),建议加上 functools.wraps

from functools import wraps

def logger(level):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(f"[{level.upper()}] 正在执行 {func.__name__}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@logger("debug")
def test():
    """测试函数"""
    print("running test")

print(test.__name__)  # 输出: test(没被wrapper覆盖)
print(test.__doc__)   # 输出: 测试函数

支持多种参数的实用例子

比如限制函数重试次数的装饰器:

def retry(max_attempts=3):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for i in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"第 {i+1} 次尝试失败: {e}")
                    if i == max_attempts - 1:
                        raise
        return wrapper
    return decorator

@retry(max_attempts=2)
def may_fail():
    import random
    if random.random() < 0.8:
        raise ConnectionError("网络错误")
    print("成功!")

# 可能重试一次后成功
may_fail()

基本上就这些。关键点是:带参数的装饰器 = 函数返回装饰器。结构清晰,层层嵌套,配合 wraps 更专业。

以上就是python带参数的装饰器怎么写?的详细内容,更多请关注其它相关文章!


# app  # ai  # 中间层  # 重试  # python  # 青海省网站优化厂商  # 网站建设的安全措施  # 企业网站优化报价  # 推广网站跳出率高  # 高端会所营销推广  # 舞钢本地网站推广平台  # 南昌网络营销seo  # 营销推广实践培训  # 关键词软文排名推荐  # 网站优化电池设置方法  # 等功能  # 解决问题  # 中文网  # 相关文章  # 你想  # 是一个  # 命令行  # 表单 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 163邮箱注册官网 免费申请163个人邮箱  淘宝网网页版登录入口 淘宝官方网页版快捷登录  深入理解J*a编译器的兼容性选项:从-source到--release  新三国志曹操传110级星符试炼夏侯渊极难攻略  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  整合Supabase认证与Django模型:跨模式迁移的解决方案  怎么在mac上运行html代码_mac运行html代码方法【指南】  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  outlook中文官网入口地址 outlook官方中文版直达首页链接  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  响应式容器内容自动缩放与宽高比维持教程  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  动漫岛观看全网网 动漫岛在线正版动漫入口  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  反效果?《战地6》免费试玩开启后玩家数不升反降  UC浏览器网页版登录入口官网 电脑版网址入口  Typer应用中动态命令行参数的解析与处理  漫蛙网页登录入口 漫蛙漫画官方授权网址  Win11网速慢怎么解决 Win11网络设置优化解除限速  快手官方唯一登录入口 谨防山寨钓鱼网站  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  C++ vector二维数组定义_C++ vector of vector用法  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  mc.js官网登录入口 mc.js官方登录入口最新版  如何在J*a中使用Locale处理多语言环境  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  在Qt QML中通过Python字典动态更新TextEdit内容的教程  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  Python:递归比较文件夹内容并找出特定类型文件的差异  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析 

搜索