这里给你准备了几个常见的 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的文档字符串
你可以从这些例子练手,然后尝试自己写装饰器,比如限制参数类型、缓存结果、日志记录等。
有任何疑问都可以问我哦!