1. Python装饰器核心概念解析
装饰器(Decorator)是Python中一种强大的语法特性,它允许在不修改原函数代码的情况下,为函数添加额外的功能。我第一次接触装饰器时,就被它的优雅实现方式所震撼——通过高阶函数和闭包的组合,实现了类似Java注解但更为灵活的功能扩展。
装饰器的本质是一个接受函数作为参数的可调用对象(通常是函数),它返回一个新的函数对象。这个新函数通常会包含对原函数的调用,并在调用前后添加额外的逻辑。这种设计模式在Python标准库中广泛应用,比如@property、@classmethod等内置装饰器。
重要提示:理解装饰器的前提是掌握Python中"函数是一等公民"的特性,即函数可以作为参数传递、作为返回值返回,也可以赋值给变量。
1.1 装饰器的基本实现原理
让我们从一个最简单的装饰器示例开始:
python复制def simple_decorator(func):
def wrapper():
print("Before function execution")
func()
print("After function execution")
return wrapper
@simple_decorator
def say_hello():
print("Hello!")
say_hello()
执行这段代码会输出:
code复制Before function execution
Hello!
After function execution
这里发生了几个关键步骤:
@simple_decorator语法实际上是say_hello = simple_decorator(say_hello)的语法糖simple_decorator接收原函数作为参数,返回一个新的wrapper函数- 当我们调用
say_hello()时,实际上调用的是wrapper()函数
1.2 装饰器的执行时机
很多初学者容易混淆装饰器的执行时机。需要明确的是:装饰器在函数定义时立即执行,而不是在函数调用时。例如:
python复制def decorator(func):
print("Decorator executed")
def wrapper():
print("Wrapper executed")
func()
return wrapper
@decorator
def my_func():
print("Original function")
print("After decoration")
my_func()
输出结果为:
code复制Decorator executed
After decoration
Wrapper executed
Original function
可以看到,装饰器代码在@decorator这一行就立即执行了,而wrapper函数内的代码是在实际调用时才执行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装饰器的进阶用法
2.1 处理带参数的函数
上面的简单装饰器只能装饰无参数的函数。实际应用中,我们需要处理各种参数情况:
python复制def param_decorator(func):
def wrapper(*args, **kwargs):
print(f"Received args: {args}, kwargs: {kwargs}")
result = func(*args, **kwargs)
print(f"Function returned: {result}")
return result
return wrapper
@param_decorator
def calculate(a, b, operation='add'):
if operation == 'add':
return a + b
elif operation == 'multiply':
return a * b
calculate(3, 5, operation='multiply')
这个装饰器使用了*args和**kwargs来接收任意参数,确保它可以装饰任何签名的函数。输出结果为:
code复制Received args: (3, 5), kwargs: {'operation': 'multiply'}
Function re
