📅  最后修改于: 2023-12-03 15:27:53.544000             🧑  作者: Mango
装饰器模式是一种常用于 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 中,定义装饰器可以使用闭包机制。常见的应用场景包括添加日志记录、检查用户权限、缓存函数结果等等。