Python实例/类方法缓存装饰器

要写一个python的实例/类方法缓存装饰器,需要有一个前置知识就是获取实例/类对象,这里可以通过__get__方法来获取调用者的实例/类。

另外,需要定义一个dict,基于内存id的唯一性,可以使用id作为key,运算的结果作为值,装饰器就可以写出来了

 

class CacheDeco(object):
    def __init__(self, func):
        self.func = func
        self.funced_map = dict()

    def __get__(self, instance, owner):
        k = id(self.func)
        if instance:
            obj = instance
        elif owner:
            obj = owner
        else:
            raise ValueError('wrong type object!')

        def wrapper(*args, **kwargs):
            if k in self.funced_map:
                v = self.funced_map[k]
            else:
                v = self.func(obj, *args, **kwargs)
                self.funced_map[k] = v

            return v
        return wrapper

如果想要做的功能更强一点,可以添加参数校验,比如:参与运算的参数和运算的结果组成的元组作为值;或者把‘参与运算的参数和运算的结果组成的元组’作为元素放入到一个列表当中,以这个列表作为值。这里只提供一个思路,具体的可以自行拓展

后面提供一个测试代码:

class decoed(object):
    def __init__(self, *args, **kwargs):
        self.a = 1

    @CacheDeco
    def myfunc(self):
        self.a += 1
        return self.a

    @CacheDeco
    def myfunc1(self):
        self.a += 2
        return self.a


d = decoed()
print(d.myfunc())
print(d.myfunc1())

print(d.myfunc())
print(d.myfunc1())

这里的输出会是

>>> 2

>>> 4

>>> 2

>>> 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python装饰是一个可以在不修改函数本身的情况下,在调用函数前后添加额外的功能的一种机制。它可以被用来检测函数的参数,缓存函数的结果,添加日志,授权等。下面是一个使用装饰实例:@decorator def func(param1, param2): return param1 + param2func(2, 3)上面的代码中,@decorator语句会在调用func()函数之前调用decorator函数,增加额外的功能。 ### 回答2: 装饰Python中一种特殊的函数,它可以用来修改其他函数的功能。装饰接受一个函数作为输入,并返回一个新的函数作为输出。通过装饰,我们可以在不修改原函数代码的情况下,给函数添加新的功能或者修改原有功能。 装饰有以下几个特点: 1. 装饰可以用来修改函数的行为,比如在函数执行前后添加一些额外的逻辑。 2. 装饰是函数的高级用法,在Python中被广泛使用。 3. 装饰本质上是一个闭包函数,它接受一个函数作为参数,并返回一个新函数。 4. 在使用装饰时,使用@语法糖可以使得代码更加简洁明了。 下面是一个装饰实例,用于计算函数的执行时间: ```python import time def calc_time(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"函数 {func.__name__} 执行时间为:{end_time - start_time} 秒") return result return wrapper @calc_time def my_func(n): time.sleep(n) return n result = my_func(3) print(result) ``` 在上述例子中,calc_time是一个装饰函数,它接受一个函数作为参数,并返回一个新函数。新函数wrapper在原函数执行前后分别记录了开始时间和结束时间,并打印了函数的执行时间。通过@calc_time语法糖,在定义my_func函数时,自动应用了装饰。最后调用my_func(3)时,装饰会对my_func函数进行修饰,计算函数的执行时间,并返回结果。 ### 回答3: 装饰Python中一种特殊的函数,它可以动态地修改其他函数的行为。装饰本身是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰用于在不修改原函数代码的情况下,添加额外的功能或修改原函数的行为。 装饰通常使用@语法来使用,将其放在要装饰的函数上方。装饰可以用来进行代码的日志记录、输入参数的验证、性能分析等。实现一个装饰的基本步骤如下: 1. 创建一个装饰函数,接受一个函数作为输入参数。 2. 在装饰函数内部,定义一个嵌套函数,用于实现额外的功能。 3. 在嵌套函数内部,执行原函数,并对原函数的返回结果进行处理。 4. 返回嵌套函数作为装饰函数的结果。 下面是一个简单的装饰实例: ```python def log_decorator(func): def wrapper(*args, **kwargs): print("开始执行函数") result = func(*args, **kwargs) print("函数执行结束") return result return wrapper @log_decorator def add(a, b): return a + b result = add(3, 5) print(result) ``` 在上面的例子中,我们定义了一个装饰函数log_decorator。它接受一个函数作为参数,并返回一个新的函数wrapper。在wrapper函数内部,我们首先输出"开始执行函数",然后调用原函数add,并将其返回结果保存在result变量中。最后,我们输出"函数执行结束"并返回result。 当我们调用add函数时,实际上是调用了被装饰过的函数wrapper。这样我们就可以在不修改add函数的情况下,给它添加额外的功能,即输出函数的执行过程。 上述代码的输出结果为: ``` 开始执行函数 函数执行结束 8 ``` 从输出结果可以看出,装饰成功地在add函数的执行前后进行了额外的操作。这就是装饰的基本使用方法和作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值