本文主要是介绍深度解析Python装饰器常见用法与进阶技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析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_decorator
def say_hello():
print('Hello, world!')
http://www.chinasem.cnsay_hello()
输出:
Before function call
Hello, world!
After function call
函数装饰器的常见用法
1.日志记录
import logging def 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 time def timeit(func): def China编程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):DnsWSs 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 @singleton class 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 wrapper class MyClass: @method_logger def foo(self): print('foo called')
装饰器的嵌套与组合
多个装饰器可以叠加使用编程,执行顺序为自下而上:
@decorator_a @decorator_b def func(): pass # 等价于 func = decorator_a(decorator_b(func))
进阶技巧:保留元信息与类型提示
装饰器会改变被装饰函数的元信息(如__name__
, __doc__
),推荐用 functools.wraps
保留原信息:
from functools import wraps def 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装饰器内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于深度解析Python装饰器常见用法与进阶技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!