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

@log_decorator

def multiply(a, b):

return a * b

print(add(3, 5))

print(multiply(4, 6))

```

带参数的装饰器

```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")

```

实际应用场景

1. 性能计时

```python

import time

def timer_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

@timer_decorator

def slow_function():

time.sleep(1)

return "完成"

slow_function()

```

2. 权限验证

```python

def require_auth(func):

@functools.wraps(func)

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

if not user.get('is_authenticated'):

raise PermissionError("用户未认证")

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

return wrapper

@require_auth

def view_dashboard(user):

return "欢迎查看仪表盘"

```

小结

装饰器是 Python 高级编程的核心概念之一,掌握它可以让你的代码更加优雅和可维护。记住关键点:

  1. 装饰器本质是返回函数的函数

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

  3. 使用 `*args, **kwargs` 支持任意参数

  4. 可以堆叠多个装饰器

动手实践是掌握装饰器的最佳方式,试试创建你自己的装饰器吧!

相关推荐
北i3 分钟前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
诺伦9 分钟前
OpenAI Agents API 公测拆解:托管编排+持久会话+自有沙箱搭一条自动增长流水线 | RiseClaw玄策
python·openai·ai agent·营销自动化·agent编排
10mAh14 分钟前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
坊钰33 分钟前
【LangGraph框架入门级】2. 图核心概念:State、Node、Edge 与 Reducers
python·ai编程·langgraph
wewowilling35 分钟前
AI大模型开发--01Python基础(无废话)
开发语言·python·函数
小猴子爱上树36 分钟前
跨境电商AI图片翻译工具:批量图片翻译、视频字幕翻译与智能抠图一站式解决
大数据·人工智能·python·音视频
5G微创业39 分钟前
去除抖音视频水印的Python实现
python·微信小程序·去水印
WeiXin_DZbishe41 分钟前
基于微信小程序的本地闲置物品交易平台-计算机毕设 附源码【课程设计】26825
vue.js·spring boot·python·微信小程序·架构·php·课程设计
小羊没烦恼!42 分钟前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
M--Y43 分钟前
LangChain 提示工程:少样本提示与输出解析器
python·langchain·大模型·llm·输出解析器·少样本提示