深度解析Python装饰器常见用法与进阶技巧 如何装python
目录
- 装饰器的基本原理
- 函数装饰器的常见用法
- 带参数的装饰器
- 类装饰器与技巧装饰器
- 装饰器的嵌套与组合
- 进阶技巧:保留元信息与类型提示
- 装饰器最佳操作
- 拓展资料
装饰器的基本原理
装饰器本质上一个高阶函数,即:以函数为参数并返回新函数的函数。它可以在不修改原始函数代码的前提下,动态地为其添加功能。
def my_decorator(func): def wrapper(args, kwargs): print(‘Before function call’) result = func(args, kwargs) print(‘After function call’) return result return wrapper@my_decoratordef say_hello(): print(‘Hello, world!’)say_hello()
输出:
Before function call
Hello, world!
After function call
函数装饰器的常见用法
1.日志记录
import loggingdef log_decorator(func): def wrapper(args, kwargs): logging.info(f’Calling func.__name__}’) return func(args, kwargs) return wrapper
2.权限校验
def require_admin(func): def wrapper(user, args, kwargs): if not user.is_admin: raise PermissionError(‘Admin required’) return func(user, args, kwargs) return wrapper
3.性能分析
import timedef timeit(func): def wrapper(args, kwargs): start = time.time() result = func(args, kwargs) end = time.time() print(f’func.__name__} took end – start:.4f}s’) return result return wrapper
4.缓存机制
from functools import lru_cache@lru_cache(maxsize=128)def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)
带参数的装饰器
带参数的装饰器需要再包一层函数:
def repeat(times): def decorator(func): def wrapper(args, kwargs): for _ in range(times): result = func(args, kwargs) return result return wrapper return decorator@repeat(3)def greet(): print(‘Hello!’)
类装饰器与技巧装饰器
类装饰器
可以用于增强类的功能:
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@singletonclass Database: pass
技巧装饰器
与函数装饰器类似,但要注意 self 的传递:
def method_logger(func): def wrapper(self, args, kwargs): print(f’Calling func.__name__} of self}’) return func(self, args, kwargs) return wrapperclass MyClass: @method_logger def foo(self): print(‘foo called’)
装饰器的嵌套与组合
多个装饰器可以叠加使用,执行顺序为自下而上:
@decorator_a@decorator_bdef func(): pass 等价于 func = decorator_a(decorator_b(func))
进阶技巧:保留元信息与类型提示
装饰器会改变被装饰函数的元信息(如__name__
, __doc__
),推荐用 functools.wraps
保留原信息:
from functools import wrapsdef my_decorator(func): @wraps(func) def wrapper(args, kwargs): return func(args, kwargs) return wrapper
对于类型提示,可以直接在装饰器和被装饰函数中添加 type hints。
装饰器最佳操作
- 始终使用 functools.wraps 保留函数元信息
- 为装饰器编写单元测试,确保功能可复用且无副影响
- 合理使用装饰器,避免过度嵌套导致调试困难
- 利用标准库装饰器(如 @staticmethod, @classmethod, @property, @lru_cache)提升开发效率
- 为装饰器添加类型提示和文档字符串
拓展资料
Python 装饰器让我们以声明式、可复用的方式增强函数和类的行为。掌握装饰器的原理与用法,不仅能提升代码的可读性和复用性,更能让你的 Python 项目更具专业水准。建议在实际开发中多加练习,灵活运用装饰器解决实际难题。
到此这篇关于深度解析Python装饰器常见用法与进阶技巧的文章就介绍到这了,更多相关Python装饰器内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
无论兄弟们可能感兴趣的文章:
- Python装饰器之类装饰器详解
- python装饰器带参数和不带参数步骤详解
- 详解Python怎样利用装饰器实现重试机制
- Python中的各种装饰器解析
- python必学聪明之装饰器详解
- Python中的装饰器类详解
- python装饰器简介及同时使用多个装饰器的技巧