Python装饰器开发实践
Python装饰器开发实践从语法糖到设计利器装饰器的本质语法糖背后的魔法在Python的世界里装饰器Decorator常被描述为“语法糖”但这简单的比喻往往掩盖了其真正的威力。装饰器本质上是一个高阶函数它接受一个函数作为参数并返回一个新的函数。这种“函数包装函数”的模式为代码的扩展和维护提供了优雅的解决方案。让我们从一个最简单的装饰器开始pythondef simple_decorator(func):def wrapper():print(函数执行前)result func()print(函数执行后)return resultreturn wrappersimple_decoratordef greet():print(Hello, World!)greet()输出函数执行前Hello, World!函数执行后装饰器的进阶应用1. 带参数的装饰器实际开发中我们经常需要装饰器能够接受参数以实现更灵活的配置pythondef repeat(n):重复执行函数的装饰器def decorator(func):def wrapper(args, kwargs):results []for _ in range(n):results.append(func(args, kwargs))return resultsreturn wrapperreturn decoratorrepeat(3)def say_hello(name):print(fHello, {name}!)return fGreeted {name}say_hello(Alice)2. 保留函数元信息装饰器会覆盖原始函数的元信息如函数名、文档字符串等使用functools.wraps可以解决这个问题pythonfrom functools import wrapsdef timing_decorator(func):wraps(func)def wrapper(args, kwargs):import timestart time.time()result func(args, kwargs)end time.time()print(f{func.__name__}执行时间: {end - start:.4f}秒)return resultreturn wrapper装饰器在Web开发中的实践在Web框架如Flask或FastAPI中装饰器扮演着至关重要的角色pythonFlask路由装饰器示例from flask import Flask, request, jsonifyapp Flask(__name__)def require_auth(func):wraps(func)def wrapper(args, kwargs):token request.headers.get(Authorization)if not token or not validate_token(token):return jsonify({error: 未授权\