在Python中,装饰器是一种非常强大的工具,它可以让你在代码运行时动态地修改函数或方法的行为。本文将介绍10个好用的装饰器,通过详细的代码示例,帮助零基础的朋友入门并逐渐理解装饰器的用法。
1. 简单的装饰器
首先,来看一个简单的装饰器示例:
def simple_decorator(func):
def wrapper():
print("Before function execution.")
func()
print("After function execution.")
return wrapper
@simple_decorator
def say_hello():
print("Hello!")
say_hello()
输出:
Before function execution.
Hello!
After function execution.
这个装饰器在执行被装饰的函数前后,输出了一些信息。
2. 带参数的装饰器
下面的装饰器可以处理带参数的函数。
def decorator_with_args(func):
def wrapper(*args, **kwargs):
print("Arguments received:", args, kwargs)
return func(*args, **kwargs)
return wrapper
@decorator_with_args
def add(a, b):
return a + b
result = add(3, 4)
print("Result:", result)
输出:
Arguments received: (3, 4) {}
Result: 7
3. 计时装饰器
这个装饰器可以计算函数执行的时间。
import time
def time_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Execution time: {end_time - start_time:.4f} seconds")
return result
return wrapper
@time_decorator
def slow_function():
time.sleep(2)
print("Finished slow function!")
slow_function()
4. 缓存装饰器
使用这个装饰器可以缓存函数的返回值,避免重复计算。
def cache(func):
memo = {}
def wrapper(*args):
if args not in memo:
memo[args] = func(*args)
return memo[args]
return wrapper
@cache
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(10)) # 55
5. 权限检查装饰器
这个装饰器可以用于检查用户有没有某种权限。
def require_permission(permission):
def decorator(func):
def wrapper(user):
if permission in user['permissions']:
return func(user)
else:
print("Permission denied!")
return None
return wrapper
return decorator
@require_permission('admin')
def delete_user(user):
print(f"User {user['name']} deleted.")
current_user = {'name': 'Alice', 'permissions': ['read', 'write']}
delete_user(current_user) # Permission denied!
6. 重试装饰器
这个装饰器可以在函数执行失败时进行重试。
def retry(max_retries=3):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(max_retries):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"Error: {e}. Retrying...")
print("Max retries exceeded.")
return wrapper
return decorator
@retry(max_retries=3)
def unreliable_function():
raise ValueError("Something went wrong!")
unreliable_function()
7. 日志装饰器
该装饰器可以记录函数的调用信息。
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__} with arguments {args} and {kwargs}")
return func(*args, **kwargs)
return wrapper
@log_decorator
def multiply(x, y):
return x * y
multiply(2, 5)
8. 只执行一次的装饰器
这个装饰器可以确保函数只执行一次。
def run_once(func):
has_run = False
def wrapper(*args, **kwargs):
nonlocal has_run
if not has_run:
has_run = True
return func(*args, **kwargs)
else:
print("Function has already been executed.")
return wrapper
@run_once
def init():
print("Initialization done!")
init() # 只会打印一次
init() # 打印 "Function has already been executed."
9. 类方法装饰器
装饰器不仅可以用于函数,也可以用于类方法。
def class_method_decorator(func):
def wrapper(cls, *args, **kwargs):
print(f"Calling class method {func.__name__} of {cls.__name__}")
return func(cls, *args, **kwargs)
return wrapper
class MyClass:
@class_method_decorator
def my_method(cls):
print("Hello from class method!")
MyClass.my_method()
10. 线程安全装饰器
这个装饰器可用于保证函数在多线程环境下的安全性。
import threading
def synchronized(func):
lock = threading.Lock()
def wrapper(*args, **kwargs):
with lock:
return func(*args, **kwargs)
return wrapper
@synchronized
def safe_function():
print("This function is thread-safe.")
# 可以在多个线程中调用safe_function,确保它是安全的。
以上就是10个好用的Python装饰器示例。通过这些装饰器的介绍,你应该对装饰器的用法有了更深入的理解。装饰器可以广泛应用于日志记录、权限检查、性能监控等场景,加深对装饰器的理解将有助于提升你的Python编程技能。