1 什么是装饰器 装饰器的本质是Python中的高阶函数。它接收一个函数作为输入,并返回一
装饰器的本质是Python中的高阶函数。它接收一个函数作为输入,并返回一个功能增强的新函数,整个过程无需修改原函数的内部代码。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
装饰器是实现通用功能复用的核心工具,其可行性建立在Python语言的三个关键特性之上:
@decorator语法提供了直观的声明式使用方式,极大提升了代码的可读性与简洁性。装饰器在Python开发中广泛应用,主要解决以下四个核心问题:
装饰器在工程实践中主要应用于以下场景,如同为函数装备可插拔的功能模块。
自动记录函数的执行入口、出口及关键节点,为系统行为审计与问题排查提供完整链路追踪。
import functools
import datetime
def logger(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"[{datetime.datetime.now()}] 调用函数: {func.__name__}")
result = func(*args, **kwargs)
print(f"[{datetime.datetime.now()}] 函数 {func.__name__} 执行完成")
return result
return wrapper
@logger
def process_data():
print(“正在处理数据…”)
精确测量函数执行耗时,是性能分析与优化工作中定位瓶颈的首要步骤。
import time
import functools
def timer(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
在函数执行前进行访问控制,确保只有具备相应角色或权限的请求才能触发核心操作。
def permission_check(required_role):
def decorator(func):
def wrapper(*args, **kwargs):
user_role = getattr(args[0], ‘role’, ‘guest’) if args else ‘guest’
if user_role != required_role:
raise PermissionError(f"需要 {required_role} 权限")
return func(*args, **kwargs)
return wrapper
return decorator
class Admin:
def __init__(self):
self.role = ‘admin’
@permission_check(‘admin’)
def delete_user(self):
print(“删除用户操作成功”)
对计算密集型或IO密集型函数的结果进行缓存,避免重复计算,显著提升程序响应速度。
def cache(func):
stored = {}
@functools.wraps(func)
def wrapper(*args):
if args in stored:
print(“从缓存获取结果”)
return stored[args]
result = func(*args)
stored[args] = result
return result
return wrapper
@cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
在异步编程范式下,装饰器需要适配async/await语法。关键点在于包装函数需定义为async def,并在调用被装饰的协程时使用await关键字。
测量异步函数的执行时间,需使用异步兼容的时间获取方法。
import asyncio
import functools
import datetime
def async_timer(func):
@functools.wraps(func)
async def wrapper(*args, **kwargs):
start = asyncio.get_event_loop().time()
print(f"[{datetime.datetime.now()}] 异步函数 {func.__name__} 开始执行")
result = await func(*args, **kwargs)
end = asyncio.get_event_loop().time()
print(f"[{datetime.datetime.now()}] 异步函数 {func.__name__} 执行完成,耗时: {end-start:.4f}秒")
return result
return wrapper
@async_timer
async def fetch_data():
print(“正在获取数据…”)
await asyncio.sleep(2) # 模拟异步IO操作
print(“数据获取完成”)
# 运行异步函数
asyncio.run(fetch_data())
为不稳定的网络请求或外部服务调用提供具备退避策略的自动重试能力,提升系统韧性。
import asyncio
import functools
import random
def async_retry(max_attempts=3, delay=1):
def decorator(func):
@functools.wraps(func)
async def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return await func(*args, **kwargs)
except Exception as e:
if attempt == max_attempts - 1:
raise e
print(f”第{attempt+1}次尝试失败: {e},{delay}秒后重试…”)
await asyncio.sleep(delay)
return wrapper
return decorator
@async_retry(max_attempts=3, delay=1)
async def unreliable_api():
# 模拟不稳定的API调用
if random.random() < 0.7: # 70%概率失败
raise ConnectionError(“网络连接失败”)
print(“API调用成功”)
# 运行异步函数
asyncio.run(unreliable_api())
对异步函数的结果进行缓存,减少对后端服务或数据库的重复查询压力。在高并发场景下需注意缓存访问的线程安全性。
import asyncio
import functools
def async_cache(func):
stored = {}
@functools.wraps(func)
async def wrapper(*args):
if args in stored:
print(“从缓存获取异步结果”)
return stored[args]
result = await func(*args)
stored[args] = result
return result
return wrapper
@async_cache
async def get_user_info(user_id):
print(f”正在获取用户{user_id}信息…”)
await asyncio.sleep(1) # 模拟异步IO
return {“id”: user_id, “name”: f"用户{user_id}"}
# 运行异步函数
async def main():
# 第一次调用,会执行函数
user1 = await get_user_info(1)
print(user1)
# 第二次调用,会从缓存获取
user2 = await get_user_info(1)
print(user2)
asyncio.run(main())
掌握基础装饰器后,可通过以下高级技巧实现更灵活、强大的功能封装。
通过外层函数接收配置参数,实现装饰器行为的动态定制,例如控制重试次数与延迟间隔。
def retry(max_attempts=3, delay=1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
if attempt == max_attempts - 1:
raise e
print(f”第{attempt+1}次尝试失败,{delay}秒后重试…”)
time.sleep(delay)
return wrapper
return decorator
通过实现__call__魔术方法,使类实例可像函数一样被调用。类装饰器能利用实例属性更优雅地管理内部状态。
class CountCalls:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f”函数 {self.func.__name__} 被调用 {self.count} 次")
return self.func(*args, **kwargs)
回顾文初的电商平台故障案例,若核心的process_order函数已装配具备全链路追踪与性能分析的异步装饰器,问题定位将变得极为高效:日志能立即指向支付、库存或物流中的阻塞环节,耗时数据可直接揭示性能瓶颈。
这正是装饰器的价值所在。它通过非侵入式的元编程手段,将日志、监控、安全、缓存等横切关注点封装为可复用的组件。从同步到异步,从基础装饰到参数化配置,装饰器体系为Python开发者提供了一套强大的功能增强工具箱。熟练运用装饰器,意味着你掌握了为代码库批量注入能力、同时保持架构整洁的关键技能。当你发现自己在多处复制相似代码时,便是考虑将其抽象为装饰器的最佳时机。
菜鸟下载发布此文仅为传递信息,不代表菜鸟下载认同其观点或证实其描述。