Python中的装饰器概念及常见应用场景
Python中的装饰器是可调用对象,它可以在不改变原函数的情况下,对函数进行额外的操作。通过装饰器,我们可以在不改变原函数的情况下,给函数添加新的功能,使得原函数变得更加强大和灵活。在Python中,装饰器是一种特殊的语法,它允许我们用似乎不相关的代码来包装函数。
Python中的装饰器有很多应用场景,下面让我们来看一下常见的应用场景。
1. 计时器
在Python中,我们可以通过装饰器来实现一个计时器,用来计算函数的执行时间。例如,我们可以定义一个计时器装饰器,在函数执行前记录下当前时间,函数执行完后再记录下时间,然后输出执行时间即可。
代码如下:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"执行时间:{end_time - start_time}")
return result
return wrapper
@timer
def func():
time.sleep(1)
if __name__ == '__main__':
func()
2. 日志记录器
在开发中,我们经常需要对函数执行过程中产生的异常进行记录,这个时候我们可以通过装饰器来实现一个日志记录器,记录函数执行过程中抛出的异常和其他信息。例如,我们可以定义一个日志记录器装饰器,在函数执行过程中输出日志信息即可。
代码如下:
def logger(func):
import logging
logging.basicConfig(filename='log.txt', level=logging.INFO)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
logging.info(f"{func.__name__}: {result}")
return result
except Exception as e:
logging.exception(f"{func.__name__}: {e}")
return wrapper
@logger
def func():
raise Exception('Error Occurred')
if __name__ == '__main__':
func()
3. 缓存
在一些函数执行时,可能需要花费较长的时间进行计算,如果每次都进行计算,效率较低,这个时候我们可以通过装饰器实现一个缓存,记录函数的执行结果,下次执行函数时,如果参数相同,直接返回缓存中的结果。例如,我们可以定义一个缓存装饰器,在函数执行时,先检查是否存在缓存,如果存在直接返回缓存中的结果,否则执行函数并将结果保存到缓存中。
代码如下:
def cache(func):
cache_dict = {}
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key in cache_dict:
return cache_dict[key]
else:
result = func(*args, **kwargs)
cache_dict[key] = result
return result
return wrapper
@cache
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
if __name__ == '__main__':
print(fib(40))
print(fib(40))
4. 权限验证
在一些需要权限验证的应用中,可能需要对一些函数进行权限验证,例如,只有管理员才有权修改某些数据,这个时候我们可以通过装饰器来实现权限验证,检查当前登录用户是否有权限执行该函数。例如,我们可以定义一个权限验证装饰器,在函数执行时先检查用户是否有权限执行该函数,如果有则执行,否则抛出异常提示没有权限。
代码如下:
def authenticated(func):
def wrapper(request, *args, **kwargs):
if request.user.is_authenticated:
return func(request, *args, **kwargs)
else:
raise Exception('Permission Denied')
return wrapper
@authenticated
def add_item(request, item_name):
# 添加商品操作
pass
总结
Python中的装饰器是一个非常强大的功能,在开发中经常用到,常见应用场景如计时器、日志记录器、缓存、权限验证等。通过装饰器,我们可以在不改变原函数的情况下对函数进行增强,使得函数变得更加强大和灵活。
