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):

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

print(f"[{timestamp}] 调用函数:{func.name}")

result = func(*args, **kwargs)

print(f"[{timestamp}] 函数执行完成")

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)) # 输出:8

print(multiply(4, 6)) # 输出:24

```

带参数的装饰器

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

输出 3 次 "Hello, 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.is_authenticated:

raise PermissionError("用户未登录")

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

return wrapper

```

总结

装饰器是 Python 中实现 AOP(面向切面编程)的重要工具,广泛应用于日志记录、性能监控、权限验证、缓存等场景。掌握装饰器能让你的代码更加优雅和可维护。


觉得有用就点个赞吧!欢迎在评论区分享你的装饰器使用经验。

相关推荐
代码中介商12 小时前
C++ STL 容器完全指南(二):vector 深入与 stringstream 实战
开发语言·c++
阿正的梦工坊16 小时前
深入理解 PyTorch 中的 unsqueeze 操作
人工智能·pytorch·python
FreakStudio17 小时前
硬件版【Cursor】?aily blockly IDE尝鲜封神,实战硬伤尽显
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
郝学胜-神的一滴18 小时前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
测试员周周19 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
摇滚侠19 小时前
@Autowired 和 @Resource 的区别
java·开发语言
2301_7838486519 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
Wy_编程19 小时前
go语言中的结构体
开发语言·后端·golang
SeaTunnel19 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
CLX050520 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python