Nico
Published on 2025-07-29 / 14 Visits
0
0

Python 装饰器

这里给你准备了几个常见的 Python 装饰器练习 demo,涵盖不同的应用场景和难度。每个例子可以直接复制运行,然后你可以尝试修改和扩展它们。


1. 基础装饰器:打印函数开始和结束

def log_func(func):
    def wrapper(*args, **kwargs):
        print(f"Start {func.__name__}")
        result = func(*args, **kwargs)
        print(f"End {func.__name__}")
        return result
    return wrapper

@log_func
def hello(name):
    print(f"Hello, {name}")

hello("Alice")

输出:

Start hello
Hello, Alice
End hello

2. 装饰器带参数:执行时间统计

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"执行耗时: {end-start:.6f}s")
        return result
    return wrapper

@timeit
def slow_func():
    time.sleep(1)

slow_func()

3. 参数化装饰器(装饰器带参数)

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def say_hi():
    print("Hi!")

say_hi()
# 输出3次Hi!

4. 实用:权限检查装饰器

def require_admin(func):
    def wrapper(user, *args, **kwargs):
        if user != "admin":
            print("没有权限!")
            return
        return func(user, *args, **kwargs)
    return wrapper

@require_admin
def delete_db(user):
    print("数据库已删除!")

delete_db("guest")  # 输出: 没有权限!
delete_db("admin")  # 输出: 数据库已删除!

5. 保持原函数元信息的装饰器(使用 functools.wraps

import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("before")
        result = func(*args, **kwargs)
        print("after")
        return result
    return wrapper

@my_decorator
def foo(x):
    """我是foo的文档字符串"""
    print("foo", x)

print(foo.__name__)         # 输出: foo
print(foo.__doc__)          # 输出: 我是foo的文档字符串

你可以从这些例子练手,然后尝试自己写装饰器,比如限制参数类型、缓存结果、日志记录等。
有任何疑问都可以问我哦!


Comment