Python 设计模式之装饰器模式

2023-04-03 00:00:00 模式 设计 装饰

装饰器模式是一种结构型设计模式,它允许在运行时动态地修改类或对象的行为。它通过将一个对象包装在一个装饰器对象中,从而为其添加新的行为或修改现有的行为。

在 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 函数)

从上面的示例中,我们可以看到装饰器可以很方便地实现缓存功能,避免重复计算或查询数据库。

相关文章