Python函数 - 装饰器函数的使用方法和实际应用
装饰器是Python中非常强大和常用的一种编程技巧,可以让我们在不改变原有代码的基础上,对其进行功能增强或调整。它可以在代码执行时动态地修改函数或类的行为和属性,是Python语言中对函数的一种高级使用方法。
1. 理解装饰器函数:
在Python中,装饰器本质上是一个Python函数,可以接受函数对象作为参数,并返回一个新函数对象(有时也可以是原函数对象)。它可以在不改变代码的情况下,用于修改或增强函数的功能,比如添加日志记录、缓存、权限校验等。通常情况下,装饰器函数被用来包装其他函数或方法,以达到增加或者修改原函数或方法功能的目的。
2. 装饰器函数的基本结构
装饰器函数的基本结构如下:
def decorator(func):
def wrapper(*args, **kwargs):
# 执行前置操作
ret = func(*args, **kwargs)
# 执行后置操作
return ret
return wrapper
装饰器函数 decorator 传入一个函数对象 func 作为参数,内部定义了一个新的函数 wrapper,并返回 wrapper 函数对象。wrapper 函数实现了对原函数 func 的包装,执行前可以执行一些自己的逻辑,执行完原函数之后也可以执行一些其他操作,最后将原函数 func 的返回值返回。
3. 装饰器的使用方法
装饰器函数的使用方法非常简单,只需要在需要装饰的函数前添加 @decorator 的语法糖即可,如下所示:
@decorator
def some_function(a,b,c):
pass
以上代码等效于执行 some_function = decorator(some_function)。即在函数定义前使用 @decorator 语法糖装饰函数 some_function,相当于对 some_function 进行了包装操作,执行 some_function 函数实际上是执行 wrapper 函数。
4. 装饰器函数的实际应用
装饰器函数在实际开发中有非常广泛的应用,常见的用法如下:
(1) 函数执行前后处理
例如,可以使用装饰器打印函数执行前的时间和执行时间:
import time
def log_time(func):
def wrapper(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs) # 执行原函数
end = time.time()
print(f"{func.__name__} running time: {end-start}")
return ret
return wrapper
@log_time
def my_function():
time.sleep(3)
my_function()
运行结果为:
my_function running time: 3.0009865760803223
(2) 权限校验
在某些场景下,需要对已有函数做权限校验,只有通过校验才能执行该函数。可以定义一个装饰器函数,对访问该函数的用户进行权限校验:
def check_permission(func):
def wrapper(*args, **kwargs):
# 校验权限的代码
# 检查是否允许访问
permission = True
if permission:
return func(*args, **kwargs)
else:
return "没有权限访问该函数"
return wrapper
@check_permission
def my_function():
pass
(3) 缓存数据
在某些场景下,需要把某个函数的结果缓存下来,以防止重复计算、提升计算速度。可以通过定义一个缓存装饰器函数来实现此功能:
def cache(func):
saved_values = {}
def wrapper(*args):
if args in saved_values:
return saved_values[args]
else:
result = func(*args)
saved_values[args] = result
return result
return wrapper
@cache
def my_function(x):
return x + 100
以上代码定义了一个缓存装饰器函数 cache,其中 saved_values 指保存缓存结果的字典对象。每次调用 my_function 函数时,先检查传入参数是否已经有缓存结果,如果有,则直接返回缓存结果,否则执行 my_function 函数计算出结果保存到缓存中。
