Python 装饰器深入理解:从语法糖到元编程
装饰器是 Python 里我最喜欢的特性之一——它让你能在不修改函数本身的情况下,给它增加行为。这篇文章从头梳理一下装饰器的原理和用法。 从闭包说起 装饰器本质上是闭包。理解闭包是理解装饰器的前提: def outer(x): def inner(): print(x) # inner 捕获了外层的 x return inner f = outer(42) f() # 输出 42,即使 outer 已经返回 inner 函数"记住"了它定义时所在的环境(x = 42),这就是闭包。 装饰器的基本形态 装饰器就是一个接受函数、返回函数的函数: def my_decorator(func): def wrapper(*args, **kwargs): print("函数执行前") result = func(*args, **kwargs) print("函数执行后") return result return wrapper @my_decorator def say_hello(name): print(f"Hello, {name}!") # 等价于:say_hello = my_decorator(say_hello) say_hello("Kada") @my_decorator 只是语法糖,等价于 say_hello = my_decorator(say_hello)。 functools.wraps:保留函数元信息 用装饰器之后,函数的 __name__、__doc__ 会被替换成 wrapper 的: print(say_hello.__name__) # 输出 "wrapper",而不是 "say_hello" 用 functools.wraps 解决: import functools def my_decorator(func): @functools.wraps(func) # 把原函数的元信息复制过来 def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper 这是写装饰器的最佳实践,几乎任何时候都应该加上。 ...