Python装饰器是许多初学者难以掌握的概念,本文将用通俗易懂的方式,带你一步步揭开它的神秘面纱。

每当在代码中看到那个神秘的@符号时,你是否感到困惑?面试被问到装饰器原理时,是否不知如何作答?
不用担心,本文将抛开晦涩难懂的理论,用实际案例循序渐进地讲解装饰器的工作原理。掌握这些知识后,你在日常编码中会不由自主地使用装饰器。
先来看一个常见开发场景。假设你需要为多个业务函数添加执行耗时统计功能,传统做法是在每个函数内部重复添加计时逻辑。
import timedef process_order():
start_time = time.time()
print("正在处理订单...")
time.sleep(1)
end_time = time.time()
print(f"耗时: {end_time - start_time} 秒")
这种方式会导致代码重复,维护困难。理想方案是:
这正是装饰器要解决的问题。
理解装饰器需要先掌握Python函数的重要特性:
示例代码:
def outer():
print("外层函数")
def inner():
print("内层函数")
return inner
装饰器本质上是一个闭包函数,它接收原函数作为参数,并返回一个新函数。
def timer(func):
def wrapper():
start = time.time()
func()
end = time.time()
print(f"耗时: {end - start:.2f}秒")
return wrapper
Python提供了@语法糖来简化装饰器调用:
@timer
def process_order():
print("处理订单中...")
使用*args和**kwargs可以让装饰器适配各种参数形式:
def timer_pro(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result
return wrapper
使用functools.wraps保留原函数的元信息:
from functools import wraps
def timer_final(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 计时逻辑
return func(*args, **kwargs)
return wrapper
本文详细讲解了Python装饰器的核心原理和实现方法,通过多个实际案例展示了如何从零开始构建功能完善的装饰器,并处理各种边界情况。