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

            instances[cls] = cls(*args, **kwargs)

        return instances[cls]

    return get_instance

@singleton

class Database:

    def __init__(self):

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

db1 = Database()

db2 = Database()

print(db1 is db2) # True

```

## 总结

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

- 日志记录

- 性能监控

- 权限验证

- 缓存机制

- 事务处理

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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐