用装饰器为Python函数注入超能力
在日常编码中,我们常常遇到重复性的需求:记录函数执行时间、缓存计算结果、验证用户权限……这些横切关注点如果散落在各个函数中,会让代码变得冗长且难以维护。今天,我们来探索Python装饰器如何优雅地解决这个问题。
装饰器的本质是一个高阶函数,它接收一个函数作为参数,并返回一个新的函数。这种“函数包装”模式让我们能在不修改原函数代码的情况下,为其添加新功能。
让我们看一个实用场景:函数缓存。假设有一个计算密集型的函数:
def expensive_calculation(n):
# 模拟复杂计算
import time
time.sleep(2)
return n * n
每次调用这个函数都要等待2秒。通过装饰器,我们可以轻松添加缓存机制:
def cache_decorator(func):
cache = {
}
def wrapper(n):
if n not in cache:
cache[n] = func(n)
return cache[n]
return wrapper
@cache_decorator
def expensive_calculation(n):
import time
time.sleep(2)
return n * n
现在,相同参数的调用只会计算一次!@cache_decorator这行简洁的语法糖背后,是Python装饰器的强大威力。
装饰器的应用远不止于此:
@staticmethod、@classmethod定义方法类型@property创建属性访问器@login_required在Web框架中验证权限@retry实现自动重试机制
理解装饰器不仅能写出更简洁的代码,更能深入领悟Python“一切皆对象”的设计哲学。从简单的函数包装开始,逐步探索带参数的装饰器、类装饰器等高级用法,你会发现Python的元编程能力正在向你敞开大门。
装饰器如同给函数穿戴上的智能装备,让它们在不改变本质的情况下获得新的能力。掌握这一特性,你的Python代码将变得更加优雅和强大。