Python装饰器函数的概念和使用
发布时间:2023-05-31 09:25:59
Python装饰器函数是Python语言中一个非常常用的函数类型,用于给已有函数添加一些额外的功能,不改变原函数的代码。 在Python语言中,装饰器函数是函数的高阶函数,即一个返回新函数的函数。将一个函数作为参数传递给装饰器函数,并返回一个新函数,该新函数具备了原始函数的行为及额外功能,实现了对原函数的装饰功能。
装饰器函数通常用于增强函数的功能,比如打印函数执行时间、权限控制、缓存等。举例而言,我们可以定义一个@timeit装饰器函数,来为内部函数增加计时功能:
import time
def timeit(func):
def wrapper(*args, **kwargs):
tic = time.time()
result = func(*args, **kwargs)
toc = time.time()
print(f"Function {func.__name__} took {toc-tic} seconds")
return result
return wrapper
@timeit
def my_function():
# some code
上面的代码定义了一个@timeit装饰器函数,接下来用@timeit装饰一个函数my_function。该装饰器记录函数my_function的执行时间并输出结果。
上面的代码等价于:
def my_function():
# some code
my_function = timeit(my_function)
通过这种方式,我们可以看到装饰器能够优雅地实现函数的装饰,而且不必对原始函数的代码进行修改。
装饰器可以有多个,一个函数可以被多个装饰器装饰。装饰器可以按照任意顺序执行,最后返回最终的装饰结果。以缓存为例,假设我们需要为一个函数添加缓存功能以提高执行效率,但是我们不希望直接修改原始函数以增加缓存功能,这时候我们可以使用装饰器函数来实现:
def cache(func):
def wrapper(*args, **kwargs):
cache_key = str(args) + str(kwargs)
if cache_key not in wrapper.cache_store:
result = func(*args, **kwargs)
wrapper.cache_store[cache_key] = result
return result
else:
return wrapper.cache_store[cache_key]
wrapper.cache_store = {}
return wrapper
@cache
def my_function():
# some time-consuming code
在上面的装饰器函数中,我们使用函数变量的嵌套特性,在闭包函数的内部定义了变量cache_key和cache_store,其中cache_store是一个类属性,用于缓存函数返回值。
上面的代码等价于:
def my_function():
# some time-consuming code
my_function = cache(my_function)
Python中的装饰器函数提供了一种非常易用的方式来实现额外功能,它可以提高函数的代码复用性和可维护性。通过装饰器,我们可以在不改变已有函数代码的情况下,实现对函数的修改和增强。
