要写一个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