markdown复制## 1. 装饰器语法糖@的本质解析
在Python中看到`@`符号时,90%的情况你遇到的是装饰器语法糖。这个看似简单的符号背后,实际上是Python语言设计中最优雅的特性之一。装饰器的本质是函数式编程中的高阶函数应用,它允许在不修改原函数代码的前提下,为函数动态添加功能。
装饰器的标准写法本应是:
```python
def decorator(func):
def wrapper():
print("Before function call")
func()
print("After function call")
return wrapper
def say_hello():
print("Hello!")
say_hello = decorator(say_hello) # 手动装饰
而使用@语法糖后,代码简化为:
python复制@decorator
def say_hello():
print("Hello!")
关键理解:装饰器在函数定义时立即执行,而不是在函数调用时。这个时间差常常是初学者困惑的根源。
2. 装饰器的四种典型应用场景
2.1 日志记录与性能监控
python复制import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} executed in {end-start:.4f}s")
return result
return wrapper
@timing_decorator
def data_processing():
# 模拟耗时操作
time.sleep(1.5)
2.2 权限校验与访问控制
python复制def admin_required(func):
def wrapper(user, *args, **kwargs):
if not user.is_admin:
raise PermissionError("Admin privileges required")
return func(user, *args, **kwargs)
return wrapper
@admin_required
def delete_database(user):
print("Database deleted!")
2.3 输入验证与类型检查
python复制def validate_types(*arg_types, **kwarg_types):
def decorator(func):
def wrapper(*args, **kwargs):
# 参数类型检查逻辑
return func(*args, **kwargs)
return wrapper
return decorator
@validate_types(arg1=int, arg2=str)
def process_data(arg1, arg2):
print(f"Processing {arg1} and {arg2}")
