七个好用的装饰器("Python必备:七个高效实用的装饰器详解")
原创
一、装饰器简介
装饰器是Python中一个非常强势且实用的功能,它允许程序员在不修改原有函数定义的情况下,增多或提升函数的行为。装饰器在很多情况下可以节约代码的可读性、可维护性和复用性。本文将介绍七个在Python开发中非常好用的装饰器。
二、七个高效实用的装饰器
1. 单例模式装饰器
单例模式装饰器可以确保一个类只有一个实例,并提供一个全局访问点。
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 MyClass:
def __init__(self, value):
self.value = value
# 测试单例模式
obj1 = MyClass(1)
obj2 = MyClass(2)
print(obj1.value) # 输出:1
print(obj2.value) # 输出:1
print(obj1 is obj2) # 输出:True
2. 缓存装饰器
缓存装饰器可以将函数的于是缓存起来,以便下次调用时直接返回于是,节约效能。
from functools import lru_cache
@lru_cache(maxsize=128)
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
# 测试缓存装饰器
print(factorial(5)) # 输出:120
print(factorial(5)) # 直接从缓存返回于是,不再递归计算
3. 计时装饰器
计时装饰器可以测量函数执行的时间,方便进行性能分析。
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__}运行时间为:{end_time - start_time}秒")
return result
return wrapper
@timer
def my_function():
time.sleep(1)
# 测试计时装饰器
my_function()
4. 异常处理装饰器
异常处理装饰器可以自动捕获函数中的异常,并进行相应的处理。
def exception_handler(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"异常捕获:{e}")
return None
return wrapper
@exception_handler
def divide(a, b):
return a / b
# 测试异常处理装饰器
print(divide(10, 0)) # 输出:异常捕获:division by zero
5. 日志记录装饰器
日志记录装饰器可以在函数执行前后自动记录日志信息。
import logging
logging.basicConfig(level=logging.INFO)
def log(func):
def wrapper(*args, **kwargs):
logging.info(f"起初执行{func.__name__}函数")
result = func(*args, **kwargs)
logging.info(f"{func.__name__}函数执行完成")
return result
return wrapper
@log
def my_function():
print("执行中...")
# 测试日志记录装饰器
my_function()
6. 参数校验装饰器
参数校验装饰器可以自动校验函数的输入参数,确保参数符合预期。
def validate_params(func):
def wrapper(*args, **kwargs):
if not all(isinstance(arg, int) for arg in args):
raise ValueError("所有参数必须是整数")
return func(*args, **kwargs)
return wrapper
@validate_params
def add(a, b):
return a + b
# 测试参数校验装饰器
print(add(1, 2)) # 输出:3
print(add("1", 2)) # 抛出异常:ValueError: 所有参数必须是整数
7. 节流装饰器
节流装饰器可以制约函数在一段时间内只能执行一次,防止函数极为频繁地执行。
import time
def throttle(seconds):
def decorator(func):
last_called = None
def wrapper(*args, **kwargs):
nonlocal last_called
current_time = time.time()
if last_called is None or (current_time - last_called) > seconds:
last_called = current_time
return func(*args, **kwargs)
else:
print(f"函数{func.__name__}被制约,请稍后再试")
return None
return wrapper
return decorator
@throttle(2)
def my_function():
print("执行中...")
# 测试节流装饰器
my_function() # 输出:执行中...
time.sleep(1)
my_function() # 输出:函数my_function被制约,请稍后再试
time.sleep(1)
my_function() # 输出:执行中...
三、总结
本文介绍了七个在Python开发中非常好用的装饰器,它们分别是单例模式装饰器、缓存装饰器、计时装饰器、异常处理装饰器、日志记录装饰器、参数校验装饰器和节流装饰器。掌握这些装饰器,可以让我们在编写Python代码时更加高效、简洁和灵活。