Python-装饰器

前言

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秒钟,这就是我们需要的缓存效果,希望通过本文大家可以更好地理解装饰器,提高开发效率。


欢迎关注,学习不迷路!

你可能感兴趣的:(python,python,开发语言)