当前位置: 首页 > news >正文

Python 装饰器实战:从入门到精通

# Python 装饰器实战:从入门到精通

## 什么是装饰器?

装饰器(Decorator)是 Python 中一种强大的工具,它允许你在不修改原函数代码的情况下,动态地给函数添加功能。简单来说,装饰器就是一个"包装器",它包裹住你的函数,在函数执行前后添加额外的逻辑。

## 基础语法

装饰器的基本语法使用 `@` 符号:

```python

def my_decorator(func):

def wrapper():

print("函数执行前")

func()

print("函数执行后")

return wrapper

@my_decorator

def say_hello():

print("Hello!")

say_hello()

# 输出:

# 函数执行前

# Hello!

# 函数执行后

```

## 实用场景一:日志记录

```python

import functools

from datetime import datetime

def log_decorator(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

print(f"[{datetime.now()}] 调用函数:{func.__name__}")

result = func(*args, **kwargs)

print(f"[{datetime.now()}] 函数执行完成")

return result

return wrapper

@log_decorator

def add(a, b):

return a + b

add(3, 5)

```

## 实用场景二:性能计时

```python

import time

def timing_decorator(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

start = time.time()

result = func(*args, **kwargs)

end = time.time()

print(f"{func.__name__} 执行耗时:{end - start:.4f}秒")

return result

return wrapper

@timing_decorator

def slow_function():

time.sleep(2)

print("任务完成")

slow_function()

```

## 实用场景三:权限验证

```python

def require_auth(func):

@functools.wraps(func)

def wrapper(user, *args, **kwargs):

if not user.is_authenticated:

raise PermissionError("用户未登录")

return func(user, *args, **kwargs)

return wrapper

@require_auth

def delete_account(user):

print("删除账户")

```

## 带参数的装饰器

```python

def repeat(times):

def decorator(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

for _ in range(times):

result = func(*args, **kwargs)

return result

return wrapper

return decorator

@repeat(3)

def greet(name):

print(f"Hello, {name}!")

greet("World")

```

## 多个装饰器叠加

```python

@log_decorator

@timing_decorator

def process_data():

time.sleep(1)

print("数据处理完成")

process_data()

```

## 总结

装饰器是 Python 中的高级特性,掌握它可以让你写出更优雅、更模块化的代码。常见的应用场景包括:

- 日志记录

- 性能监控

- 权限验证

- 缓存机制

- 事务处理

记住使用 `@functools.wraps` 来保留原函数的元信息,这是一个好的实践习惯。

http://www.jsqmd.com/news/514136/

相关文章:

  • 如何提升病理切片诊断质量?解决 HE 染色对比度低与背景干扰的品牌选型指南
  • Z-Image模型.NET开发:C#调用AI绘图API实战
  • Qwen3-VL:30B模型服务网格:Istio流量管理
  • 别再只用UART了!手把手教你用SIT3232E和SIT3485E搞定RS232/RS485电路(附完整原理图)
  • openstack下载iaas-install-nova-compute.sh出错怎么办
  • IP的纯净度和覆盖率,为何决定代理效果?
  • 6、C语言指针专题:动态内存分配
  • CD4013触发器实战:如何用双稳态电路驱动继电器(附防烧线圈技巧)
  • OpenClaw+CC Switch:小白也能配置好的小龙虾(2026最新)
  • 除了防抖和节流,还有哪些 JS 性能优化手段?
  • 【搜索与图论】DFS算法(深度优先搜索)
  • 避坑指南:ESP-IDF 4.3下DPP配网常见的3个错误(附事件组调试方法)
  • 用过才敢说!全领域适配的AI论文写作神器 —— 千笔AI
  • Qwen-Image部署教程:RTX4090D+Qwen-Image镜像构建企业级多模态API服务
  • 3.3 在代码中验证与避免误差
  • Lumerical INTERCONNECT实战:5分钟搞定自相位调制(SPM)仿真(附参数配置截图)
  • Qwen-Image定制镜像部署案例:RTX4090D支撑Qwen-VL与Stable Diffusion联动实现图文互生
  • 云容笔谈应用场景:独立设计师用AI生成苏绣/缂丝/云锦纹样设计初稿
  • STM32HAL库驱动DHT11温湿度传感器:从零开始的避坑实战(附完整代码)
  • OpenClaw语音交互扩展:Qwen3-32B对接Whisper实现语音指令控制
  • Pixel Dimension Fissioner惊艳效果展示:10组高创意文案裂变真实对比图
  • 用PID控制器模拟房间温度控制:MATLAB与Simulink的奇妙之旅
  • 灵毓秀-造相Z-Turbo案例展示:快速生成精美古风插画
  • 解决 GPT-5.4 废话多的问题
  • 用STM32F103C8T6复刻开源手表WATCHX-NWATCH:从B站视频到桌面摆件的DIY全记录
  • Qwen-Image效果展示:商品图→属性提取→文案生成全流程惊艳效果实录
  • 真的太省时间!当红之选的降AI率软件 —— 千笔·专业降AI率智能体
  • LongCat-Image-Editn效果展示:中英双语一句话改图,原图非编辑区域纹丝不动
  • 别再手动写API了!用Flask+ngrok快速给MySQL做个Dify专用接口(附完整代码)
  • Linux nc命令实战:5个网络工程师常用的Netcat技巧(附真实案例)