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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值