Python 装饰器入门
装饰器是 Python 的强大特性,可以在不修改原函数的情况下增强其功能。
1. 基本装饰器
def my_decorator(func):
def wrapper():
print("调用前")
func()
print("调用后")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
# 输出:
# 调用前
# Hello!
# 调用后
2. 带参数的装饰器
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def say_hi():
print("Hi!")
say_hi()
3. 保留原函数信息
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("调用前")
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
"""问候函数"""
return f"Hello, {name}"
print(greet.__name__) # greet
print(greet.__doc__) # 问候函数
4. 常用内置装饰器
class MyClass:
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
@property
def prop(self):
return self._value
5. 装饰器实际应用
计时装饰器
import time
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"耗时: {time.time() - start:.2f}秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
日志装饰器
def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"调用 {func.__name__}")
result = func(*args, **kwargs)
print(f"{func.__name__} 返回: {result}")
return result
return wrapper
缓存装饰器
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
装饰器是 Python 开发中的重要技能,掌握它能写出更优雅的代码。