# 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

add(3, 5)

```

## 实用场景二:性能计时

```python

import time

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

    print("任务完成")

slow_function()

```

## 实用场景三:权限验证

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

@require_auth

def delete_account(user):

    print("删除账户")

```

## 带参数的装饰器

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

```

## 多个装饰器叠加

```python

@log_decorator

@timing_decorator

def process_data():

    time.sleep(1)

    print("数据处理完成")

process_data()

```

## 总结

装饰器是 Python 中的高级特性,掌握它可以让你写出更优雅、更模块化的代码。常见的应用场景包括:

- 日志记录

- 性能监控

- 权限验证

- 缓存机制

- 事务处理

记住使用 `@functools.wraps` 来保留原函数的元信息,这是一个好的实践习惯。

Logo

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

更多推荐