Python装饰器完全指南 - 从基础到高级用法详解
- Python
- 2025-08-03
- 1672
Python装饰器完全指南
掌握Python装饰器的各种用法与高级技巧,提升代码质量和开发效率
装饰器基础
装饰器是修改其他函数功能的函数,使代码更简洁、可重用。
简单装饰器
基本装饰器示例
def simple_decorator(func):
def wrapper():
print("函数执行前操作")
func()
print("函数执行后操作")
return wrapper
@simple_decorator
def say_hello():
print("Hello!")
# 调用函数
say_hello()
装饰器使用@语法糖,使代码更清晰易读,等同于 say_hello = simple_decorator(say_hello)
带参数装饰器
装饰器可以接受参数,增加装饰器的灵活性和复用性。
带参数的装饰器
参数化装饰器示例
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator_repeat
@repeat(num_times=3)
def greet(name):
print(f"Hello {name}")
greet("Alice")
带参数装饰器需要三层嵌套函数:参数接收层、装饰器接收层和包装函数层
类装饰器
使用类实现装饰器,可以更好地管理状态和提供更复杂的功能。
类作为装饰器
类装饰器示例
class CountCalls:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print(f"执行 {self.func.__name__} 第 {self.num_calls} 次")
return self.func(*args, **kwargs)
@CountCalls
def say_hello():
print("Hello!")
say_hello()
say_hello()
类装饰器通过实现__call__方法使实例可调用,从而保留状态信息
高级装饰器技术
保留元信息的装饰器
使用functools.wraps保留原始函数的元信息
保留元信息示例
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("装饰器操作")
return func(*args, **kwargs)
return wrapper
@my_decorator
def example():
"""示例函数文档"""
print("函数执行")
print("函数名:", example.__name__)
print("文档:", example.__doc__)
装饰器类
使用装饰器类实现更复杂的功能
装饰器类示例
class Debugger:
def __init__(self, active=True):
self.active = active
def __call__(self, func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if self.active:
print(f"调用函数: {func.__name__}")
print(f"参数: args={args}, kwargs={kwargs}")
result = func(*args, **kwargs)
if self.active:
print(f"返回值: {result}")
return result
return wrapper
@Debugger(active=True)
def add(a, b):
return a + b
add(3, 5)
多个装饰器
多个装饰器可以堆叠使用,执行顺序从下往上
多个装饰器示例
def decorator1(func):
def wrapper():
print("装饰器1 - 前")
func()
print("装饰器1 - 后")
return wrapper
def decorator2(func):
def wrapper():
print("装饰器2 - 前")
func()
print("装饰器2 - 后")
return wrapper
@decorator1
@decorator2
def my_function():
print("核心函数")
my_function()
多个装饰器堆叠时,最靠近函数的装饰器最先执行(装饰器2先于装饰器1)
装饰器的实际应用
装饰器在Python开发中广泛应用,以下是一些常见场景:
日志记录
自动记录函数调用信息、参数和返回值
性能测试
测量函数执行时间,优化代码性能
权限验证
检查用户权限后再执行函数
缓存机制
缓存函数结果,提高重复计算效率
掌握装饰器技术可以大幅提高代码的可维护性、可读性和复用性,是Python高级编程的核心技能之一。
本文由MurongLin于2025-08-03发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20257186.html
发表评论