《Python 面试:装饰器与闭包的原理》
# 🔍 Python面试必考:装饰器与闭包的原理剖析
在Python面试中,**装饰器(Decorator)**和**闭包(Closure)**是高频考点,理解它们的原理能让你在面试中脱颖而出!🎯
## 🧩 闭包(Closure)是什么?
闭包是指**一个函数**(外层函数)**返回另一个函数**(内层函数),并且内层函数可以**访问外层函数的局部变量**,即使外层函数已经执行完毕。
```python
def outer_func(x):
def inner_func(y):
return x + y # inner_func可以访问x(闭包特性)
return inner_func
closure = outer_func(10)
print(closure(5)) # 输出15(x=10被保留)
```
✅ **关键点**:
- 内层函数引用外层函数的变量(`x`)
- 外层函数执行后,变量仍被保留(不会销毁)
## 🎨 装饰器(Decorator)的本质
装饰器是**闭包的高级应用**,用于**在不修改原函数代码的情况下扩展功能**(如日志、计时、权限检查等)。
```python
def logger(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
print(add(3, 5)) # 先打印日志,再计算
```
✅ **关键点**:
- `@logger` 等价于 `add = logger(add)`
- `wrapper` 函数接收任意参数(`*args, **kwargs`)
- 装饰器可以嵌套(多个`@decorator`叠加)
## 💡 面试常见问题
1. **装饰器如何保留原函数的元信息?** → 使用**********(func)`
2. **带参数的装饰器如何实现?** → 再包一层函数,如`@decorator(arg)`
3. **闭包和普通函数有什么区别?** → 闭包能记住外层变量
掌握这些原理,面试官一定会对你刮目相看!🚀
5G.okacbd100.asia/PoSt/1123_737426.HtM
5G.okacbd099.asia/PoSt/1123_725592.HtM
5G.okacbd098.asia/PoSt/1123_081787.HtM
5G.okacbd097.asia/PoSt/1123_628758.HtM
5G.okacbd096.asia/PoSt/1123_946356.HtM
5G.okacbd095.asia/PoSt/1123_311242.HtM
5G.okacbd094.asia/PoSt/1123_135010.HtM
5G.okacbd093.asia/PoSt/1123_099907.HtM
5G.okacbd092.asia/PoSt/1123_629648.HtM
5G.okacbd091.asia/PoSt/1123_025696.HtM
5G.okacbd100.asia/PoSt/1123_447893.HtM
5G.okacbd099.asia/PoSt/1123_868602.HtM
5G.okacbd098.asia/PoSt/1123_532305.HtM
5G.okacbd097.asia/PoSt/1123_755763.HtM
5G.okacbd096.asia/PoSt/1123_438969.HtM
5G.okacbd095.asia/PoSt/1123_792011.HtM
5G.okacbd094.asia/PoSt/1123_019772.HtM
5G.okacbd093.asia/PoSt/1123_230126.HtM
5G.okacbd092.asia/PoSt/1123_546642.HtM
5G.okacbd091.asia/PoSt/1123_433759.HtM
5G.okacbd100.asia/PoSt/1123_358985.HtM
5G.okacbd099.asia/PoSt/1123_459174.HtM
5G.okacbd098.asia/PoSt/1123_595882.HtM
5G.okacbd097.asia/PoSt/1123_599242.HtM
5G.okacbd096.asia/PoSt/1123_832402.HtM
5G.okacbd095.asia/PoSt/1123_681803.HtM
5G.okacbd094.asia/PoSt/1123_215238.HtM
5G.okacbd093.asia/PoSt/1123_640159.HtM
5G.okacbd092.asia/PoSt/1123_563145.HtM
5G.okacbd091.asia/PoSt/1123_355060.HtM
5G.okacbd100.asia/PoSt/1123_022700.HtM
5G.okacbd099.asia/PoSt/1123_765053.HtM
5G.okacbd098.asia/PoSt/1123_765712.HtM
5G.okacbd097.asia/PoSt/1123_270553.HtM
5G.okacbd096.asia/PoSt/1123_247820.HtM
5G.okacbd095.asia/PoSt/1123_540157.HtM
5G.okacbd094.asia/PoSt/1123_506962.HtM
5G.okacbd093.asia/PoSt/1123_811277.HtM
5G.okacbd092.asia/PoSt/1123_246499.HtM
5G.okacbd091.asia/PoSt/1123_799018.HtM
5G.okacbd100.asia/PoSt/1123_355327.HtM
5G.okacbd099.asia/PoSt/1123_895235.HtM
5G.okacbd098.asia/PoSt/1123_941218.HtM
5G.okacbd097.asia/PoSt/1123_406352.HtM
5G.okacbd096.asia/PoSt/1123_068750.HtM
5G.okacbd095.asia/PoSt/1123_839716.HtM
5G.okacbd094.asia/PoSt/1123_917160.HtM
5G.okacbd093.asia/PoSt/1123_125974.HtM
5G.okacbd092.asia/PoSt/1123_570007.HtM
5G.okacbd091.asia/PoSt/1123_104177.HtM
查看16道真题和解析