知识拓展:设计模式之装饰器模式
装饰器模式拓展
1. 什么是装饰器模式?
装饰器模式(Decorator Pattern)是一种结构型设计模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原始类,从而在不修改原始类代码的情况下扩展其功能。
1.1 特点
- 动态地给对象添加功能
- 避免子类的爆炸性增长
- 更灵活的功能扩展
1.2 适用场景
- 需要动态地为对象添加功能
- 不能通过继承来扩展功能
- 需要对功能进行组合
2. Python 中的装饰器
Python 中的装饰器是一种语法糖,允许在不修改函数或方法代码的情况下,动态地修改其行为。装饰器可以用于函数、方法和类,常用于日志记录、访问控制、缓存等场景。
2.1 基本用法
装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰器可以通过 @decorator_name
语法应用于函数。
# 定义一个简单的装饰器
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("Function is being called")
result = func(*args, **kwargs)
print("Function has been called")
return result
return wrapper
# 使用装饰器
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
2.2 类装饰器
类装饰器是通过实现 __call__
方法的类来实现的。它们可以用于更复杂的装饰逻辑。
class MyDecorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("Class-based decorator: Function is being called")
result = self.func(*args, **kwargs)
print("Class-based decorator: Function has been called")
return result
# 使用类装饰器
@MyDecorator
def greet(name):
print(f"Greetings, {name}!")
greet("Bob")
2.3 常见应用
- 日志记录:在函数调用前后记录日志信息。
- 访问控制:检查用户权限,决定是否允许执行函数。
- 缓存:缓存函数的返回值,以提高性能。
- 性能计时:测量函数执行时间。
2.4 注意事项
- 使用
functools.wraps
保留原函数的元数据。 - 装饰器的顺序很重要,多个装饰器时从内到外应用。
- 确保装饰器不改变原函数的签名和返回值。
3. 总结
装饰器模式是一种强大的设计模式,适用于需要动态扩展对象功能的场景。Python 中的装饰器是这一模式的具体实现,提供了一种简洁而强大的方式来扩展函数和方法的功能。