Python中的装饰器是一种非常强大和灵活的功能,可以帮助程序员将重复的代码从其代码库中删除,提高代码的可读性,可维护性和可复用性
装饰器是一个函数,它接受一个函数作为输入,并返回一个新函数。装饰器可以在不修改原始函数的情况下修改或增强函数的行为。它可以在运行时动态地修改函数,并且可以像常规函数一样调用
装饰器由一个函数定义和一个符号“@”组成,这个符号通常紧跟在函数的定义上
我们经常会有一个场景就是计算服务的耗时,这个需求一般是大部分服务都需要的,我们就可以定义一个这样的装饰器,代码如下:
import time
def log(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print('func name: {}, args: {}, kwargs: {}, cost time: {}'.format(func.__name__, args, kwargs,
end_time - start_time))
return result
return wrapper
@log
def test(a, b, c=1, d=2):
print("test---------")
test(1, 2, c=3, d=4)
执行结果
test---------
func name: test, args: (1, 2), kwargs: {'c': 3, 'd': 4}, cost time: 5.0067901611328125e-06
案例二 缓存
缓存在我们开过过程中是非常常见的,对于一些数据量大,又不经常变化的数据,我们经常会缓存起来,java中的spring框架就实现的非常好,只需要在服务上加一个@Cacheable注解就可以实现缓存
我们使用装饰器模拟该实现,代码如下:
import time
class Cacheable:
memo = {}
def __init__(self, cache_id=None):
self.cache_id = cache_id
def __call__(self, func):
def wrapper(*args, **kwargs):
if self.cache_id in self.memo:
return self.memo[self.cache_id]
else:
result = func(*args, **kwargs)
self.memo[self.cache_id] = result
return result
return wrapper
@Cacheable("user")
def userList():
# 模拟业务耗时
time.sleep(2)
return [{'id': '1001', 'name': 'wendell'}]
for i in {1, 2}:
start_time = time.time()
print(userList())
end_time = time.time()
print(f"cost : {(end_time - start_time) * 1000} ms")
执行结果
[{'id': '1001', 'name': 'wendell'}]
cost : 2005.1050186157227 ms
[{'id': '1001', 'name': 'wendell'}]
cost : 0.015735626220703125 ms
从上面结果中可以看出,第二次访问时间明显快了,并没有停止2秒钟,这就是我们需要的缓存效果,希望通过本文大家可以更好地理解装饰器,提高开发效率。
欢迎关注,学习不迷路!