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

def my_decorator(func):

def wrapper(*args, **kwargs):

print("函数执行前")

result = func(*args, **kwargs)

print("函数执行后")

return result

return wrapper

@my_decorator

def greet(name, age):

print(f"姓名:{name}, 年龄:{age}")

return "完成"

result = greet("张三", 25)

print(result)

```

实用的装饰器示例

1. 日志装饰器

```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 calculate_sum(a, b):

return a + b

calculate_sum(10, 20)

```

2. 性能计时装饰器

```python

import time

import functools

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(1)

return "完成"

slow_function()

```

3. 重试装饰器

```python

import functools

import time

def retry_decorator(max_retries=3, delay=1):

def decorator(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

for i in range(max_retries):

try:

return func(*args, **kwargs)

except Exception as e:

if i == max_retries - 1:

raise

print(f"重试 {i + 1}/{max_retries}: {e}")

time.sleep(delay)

return wrapper

return decorator

@retry_decorator(max_retries=3, delay=2)

def risky_operation():

可能失败的操作

pass

```

类装饰器

装饰器不仅可以装饰函数,还可以装饰类:

```python

def singleton(cls):

instances = {}

def get_instance(*args, **kwargs):

if cls not in instances:

instancescls = cls(*args, **kwargs)

return instancescls

return get_instance

@singleton

class Database:

def init(self):

print("数据库连接已建立")

db1 = Database()

db2 = Database()

print(db1 is db2) # True

```

总结

装饰器是 Python 中非常强大的工具,合理使用可以让代码更加简洁、优雅。常见的应用场景包括:

  • 日志记录

  • 性能监控

  • 权限验证

  • 缓存机制

  • 事务处理

掌握装饰器,让你的 Python 代码更上一层楼!

相关推荐
宿州派大星3 小时前
Python实战:PyQt5 + OpenCV + Dlib 打造AI桌面应用
人工智能·python·qt
承渊政道4 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(开源大模型ChatGLM高级定制化应用实战)
人工智能·pytorch·python·llm·模型微调·glm
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真9 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes9 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停10 小时前
自动化测试(java)
java·开发语言·selenium·自动化
Smoothcloud润云10 小时前
PyTorch大模型权重加载与启动耗时优化实战:定位磁盘、内存与显存瓶颈
人工智能·pytorch·python·深度学习·gpu算力
databook10 小时前
从循环到向量化:NumPy提速的7个关键思维
python·数据分析·numpy
棉猴11 小时前
玩游戏学Python1-Python和pgzero库的安装
python·pygame·玩游戏·pgzero·pgzrun
诺伦11 小时前
GEO优化数据实证:78%引用流向官网的机制拆解与小品牌三步管线实战教程 | RiseClaw玄策
python·seo·geo·内容营销·ai搜索