1. Python装饰器基础认知
第一次在Python代码中看到@符号时,我以为是某种特殊运算符。实际上这是Python独有的装饰器语法糖(Decorator Syntax Sugar),它让函数包装变得像给礼物系丝带一样优雅。装饰器的本质是一个高阶函数——接收函数作为参数并返回新函数的函数。
装饰器在Python 2.4版本引入,最初用于简化方法定义(如@classmethod)。如今它已成为框架开发的核心工具,Django的路由配置、Flask的路由声明都重度依赖装饰器语法。理解这个语法糖,等于拿到了Python进阶开发的钥匙。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装饰器工作原理深度解析
2.1 从函数对象说起
Python中函数是一等公民(First-class citizen)。这意味着:
- 函数可以被赋值给变量
- 函数可以作为参数传递
- 函数可以作为返回值
- 函数可以嵌套定义
python复制def shout(text):
return text.upper()
# 函数作为对象赋值
yell = shout
print(yell('hello')) # 输出: HELLO
这种特性使得"函数加工厂"成为可能——我们编写一个函数,它接收旧函数,返回增强版新函数。
2.2 手动实现装饰效果
假设我们需要给函数添加执行计时功能:
python复制import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs) # 执行原函数
end = time.time()
print(f"{func.__name__} executed in {end-start:.4f}s")
return result
return wrapper
def heavy_calculation():
time.sleep(2)
# 手动包装函数
timed_heavy = timer(heavy_calculation)
timed_heavy() # 输出执行时间
这种包装方式虽然有效,但每次都需要显式调用timer()来包装目标函数,不够直观。
2.3 @语法糖的魔法
@符号的出现让装饰变得优雅:
python复制@timer
def heavy_calculation():
time.sleep(2)
# 直接调用已被装饰的函数
heavy_calculation()
Python解释器遇到@timer时,会自动执行heavy_calculation = timer(heavy_calculation
