Python 设计模式之装饰器模式
装饰器模式是一种结构型设计模式,它允许在运行时动态地修改类或对象的行为。它通过将一个对象包装在一个装饰器对象中,从而为其添加新的行为或修改现有的行为。
在 Python 中,装饰器是一种特殊的函数,它接受一个函数作为参数,并返回一个新的函数。新函数包装原函数,添加了新的功能,但不改变原函数的行为。在 Python 中,装饰器使用 @ 符号来标识。下面是一个示例:
def my_decorator(func): def wrapper(*args, **kwargs): print("Before the function is called.") result = func(*args, **kwargs) print("After the function is called.") return result return wrapper @my_decorator def say_hello(name): print(f"Hello, {name}!")
在上面的代码中,my_decorator 是一个装饰器函数,它接受一个函数作为参数,并返回一个新函数 wrapper。wrapper 函数包装原函数,添加了新的功能,即在函数调用前后输出一些文本。
我们可以使用 @my_decorator 装饰 say_hello 函数,从而为其添加新的行为。例如:
say_hello("pidancode.com")``` 输出: ```html Before the function is called. Hello, pidancode.com! After the function is called. 从输出结果可以看出,我们成功为 say_hello 函数添加了新的行为。 装饰器模式在实际开发中非常常见,它可以用于日志记录、性能分析、缓存等方面。例如,我们可以使用装饰器来实现一个简单的缓存系统: ```python def cache(func): memo = {} def wrapper(*args): if args in memo: return memo[args] result = func(*args) memo[args] = result return result return wrapper @cache def get_website(name): print(f"Fetching website {name}...") return f"{name}.com" print(get_website("pidancode")) # 输出 "Fetching website pidancode... pidancode.com" print(get_website("pidancode")) # 直接输出 "pidancode.com"(没有再次调用 get_website 函数)
从上面的示例中,我们可以看到装饰器可以很方便地实现缓存功能,避免重复计算或查询数据库。
相关文章