Python 装饰器入门
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 开发中的重要技能,掌握它能写出更优雅的代码。