📜  装饰器模式 - Python (1)

📅  最后修改于: 2023-12-03 15:27:53.544000             🧑  作者: Mango

装饰器模式 - Python

装饰器模式是一种常用于 Python 开发的设计模式,它可以在不修改原始代码的情况下,动态地添加功能或者修改现有功能的行为。在 Python 中,任何函数都可以作为另一个函数的参数,因此可以使用装饰器将一个函数转换为另一个函数。

基本定义

装饰器可以理解为一个函数,它可以接收一个函数作为参数,并返回一个新的函数。这个新的函数与原始函数的执行过程相同,但在执行过程中会动态添加或修改原始函数的功能。

使用 Python 语言,可以定义一个基本的装饰器:

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

在这个例子中,我们定义了一个装饰器 my_decorator,它接收一个函数 func 作为参数,并返回一个新的函数 wrapper。这个新的函数在执行时,会先打印一条消息,然后执行原始函数 func,再打印另一条消息。

我们可以通过在函数定义前加上 @my_decorator 来使用这个装饰器。这样,当我们调用函数 say_hello 时,实际上是调用了新的函数 wrapper,而不是原始函数 say_hello

实际使用

装饰器可以用于添加日志记录、检查用户权限、缓存函数结果等等。下面是一个使用装饰器实现缓存功能的例子:

import time

CACHE = {}

def cache_result(func):
    def wrapper(n):
        if n in CACHE:
            print("Returning cached value:", CACHE[n])
            return CACHE[n]
        result = func(n)
        CACHE[n] = result
        print("Caching result:", result)
        return result
    return wrapper

@cache_result
def slow_function(n):
    time.sleep(2)
    return n * 2

print(slow_function(3))
time.sleep(1)
print(slow_function(3))
time.sleep(2)
print(slow_function(3))

这个例子定义了一个装饰器 cache_result,它用于缓存函数 slow_function 的结果。当需要计算某个数的两倍时,可以调用函数 slow_function,如果已经计算过该数的结果,则从缓存中返回结果而不需要重新计算。

总结

使用装饰器模式可以实现在不修改原始代码的情况下,动态地为函数添加功能或者修改其行为。在 Python 中,定义装饰器可以使用闭包机制。常见的应用场景包括添加日志记录、检查用户权限、缓存函数结果等等。