👌轻松搞定python装饰器!
很多测试面试过程中会问到装饰器、生成器和迭代器,这属于python的进阶内容。
今天就带你彻底搞懂装饰器的核心原理!👇
📌 装饰器本质上是什么?
就是一个函数,接收一个函数,返回一个新函数。
核心目的:不修改原函数代码,扩展它的功能。
📌 第一步:理解"函数是一等公民"
在Python里,函数跟数字、字符串一样,都是对象——
✅ 可以赋值给变量
✅ 可以作为参数传递
✅ 可以作为返回值
✅ 可以存到列表里
这是装饰器能成立的基础,先理解这个!
📌 第二步:装饰器的工作原理
1. def log_decorator(func):
2. def wrapper():
3. print(f"[LOG] 调用 {func.__name__}")
4. func() # 执行原函数
5. return wrapper
使用方式:
1. @log_decorator
2. def say_hello():
3. print("Hello")
4. # 等价于:say_hello = log_decorator(say_hello)
⚠️ 注意:装饰器在函数定义时立即执行,不是在调用时!
📌 第三步:多个装饰器的执行顺序
1. @decorator1
2. @decorator2
3. def func(): ...
4. # 等价于 func = decorator1(decorator2(func))
执行顺序:装饰器1前 → 装饰器2前 → 原函数 → 装饰器2后 → 装饰器1后
可以理解为洋葱模型🧅
📌 第四步:别忘了 functools.wraps
1. import functools
2.
3. def my_decorator(func):
4. @functools.wraps(func) # 保留原函数元信息!
5. def wrapper(*args, **kwargs):
6. return func(*args, **kwargs)
7. return wrapper
不加 wraps,原函数名会被替换成 wrapper,调试和文档都会乱!