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

带参数的装饰器其实是一个返回装饰器的函数。也就是说,它外层多了一层函数包装,用来接收参数。
基本结构说明
要写一个带参数的装饰器,你需要三层嵌套函数:
- 最外层函数:接收装饰器的参数
- 中间层函数:接收被装饰的函数
- 最内层函数:实际执行逻辑,可以调用原函数并添加额外行为
示例:一个记录日志级别的装饰器
比如你想控制打印日志的级别(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 是基于Thinkphp5基础开发的以会员为中心的电商系统,开源版微信公众号商城和小程序商城数据同步,带积分、优惠券、秒杀、砍价、分销等功能,更是一套方便二次开发的商城框架(后台封装了独有快速创建表单功能,无需写表单页面、快速创建数据搜索和数据列表页、导出表格、系统权限配置控制每一个控制器方法、系统参数配置、数据字典、组合数据等)
0
查看详情
[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中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析


2025-11-21
浏览次数:次
返回列表
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__) # 输出: 测试函数