当前位置: 首页 > 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

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)

```

## 实用案例:计时装饰器

```python

import time

from functools import wraps

def timer_decorator(func):

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

print("任务完成")

slow_function()

```

## 实用案例:日志装饰器

```python

from functools import wraps

import logging

logging.basicConfig(level=logging.INFO)

def log_decorator(func):

@wraps(func)

def wrapper(*args, **kwargs):

logging.info(f"调用 {func.__name__}, 参数:{args}, {kwargs}")

result = func(*args, **kwargs)

logging.info(f"{func.__name__} 返回:{result}")

return result

return wrapper

@log_decorator

def add(a, b):

return a + b

add(3, 5)

```

## 带参数的装饰器

```python

def repeat(times):

def decorator(func):

@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

class CountCalls:

def __init__(self, func):

self.func = func

self.count = 0

def __call__(self, *args, **kwargs):

self.count += 1

print(f"第 {self.count} 次调用")

return self.func(*args, **kwargs)

@CountCalls

def say_hello():

print("Hello!")

say_hello()

say_hello()

```

## 多个装饰器

一个函数可以使用多个装饰器:

```python

def decorator1(func):

def wrapper(*args, **kwargs):

print("装饰器 1")

return func(*args, **kwargs)

return wrapper

def decorator2(func):

def wrapper(*args, **kwargs):

print("装饰器 2")

return func(*args, **kwargs)

return wrapper

@decorator1

@decorator2

def hello():

print("Hello!")

hello()

# 输出顺序:装饰器 2 → 装饰器 1 → Hello!

```

## 最佳实践

1. **使用 `@wraps`**:保留原函数的元信息

2. **保持装饰器简洁**:一个装饰器只做一件事

3. **处理异常**:在装饰器中妥善处理异常

4. **文档化**:为装饰器添加清晰的文档说明

## 总结

装饰器是 Python 中的高级特性,掌握它可以让你写出更优雅、更可维护的代码。从简单的日志记录到复杂的权限控制,装饰器的应用场景非常广泛。

---

_希望这篇文章能帮助你更好地理解和使用 Python 装饰器!_

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

相关文章:

  • 江苏万融系统集成有限公司:打造安全、智能、可持续的实验室全生命周期服务 - 品牌推荐用户报道者
  • 为什么选择携程任我行礼品卡回收变现?五大优势告诉你! - 团团收购物卡回收
  • ONNX 和 TensorRT是什么
  • 【MySQL进阶 | explain执行计划】
  • The_Maya_Society
  • Postman+CLA+Jenkins接口测试
  • Java继承-多态
  • 运营批量作图工具推荐:潮际好麦商品套图如何支撑日均百款上新?
  • 好利来卡回收注意事项,畅回收平台,安全可靠 - 畅回收小程序
  • 企业级日志平台实战:ELK + Filebeat + Kafka + ZooKeeper
  • 电脑提示Component mscomm32.ocx or one of its解决办法
  • Fastadmin 解决安全提示:为了你的后台安全,请勿将后台管理入口设置为admin或admin.php问题
  • [linux] 本地部署网页(windows下载node.js, 安装pnpm)
  • 【UI自动化测试】5_TPshop项目实战 _批量运行测试用例(重点)
  • 线程池学习2
  • AI时代人人都是产品经理:团队协同:AI 时代,产品经理与算法 / 研发团队的高效协同技巧
  • 嵌入式开发之C语言入门:从基础到核心语法
  • 云南昆明软式透水管安装方法
  • 基于微信小程序的教育宝学习小助手的设计与实现
  • 2026 现象级 AI 工具 OpenClaw 全解析:本地部署、自动化实战与技术揭秘
  • # Openssl关键知识
  • windows 7 用户账户的三种类型
  • Component mscomm32.ocx not correctly registered,file is missing or invalid
  • 基于Java springboot海洋馆预约系统(源码+文档+运行视频+讲解视频)
  • 基于微信小程序的家校互动平台开发与设计
  • 打开软件就弹出msvcp140.dll如何修复? 附免费下载方法分享
  • 双系统给ubuntu扩容
  • springboot基于协同过滤算法的个性化音乐推荐系统
  • 【Matlab】MATLAB教程:符号求导(以diff(x²+2x,x)为核心案例)
  • 基于微信小程序的社区养老服务系统的设计与实现