python 装饰器实现缓存_我怎么能写python装饰器进行缓存?

>您应该记住@decorator只是func = decorator(func)的语法糖.所以这里有一个区别:

(1)

@decorator

def func():

...

和…一样

func = decorator(func) # Just call of __init__

func(...) # Call of decorator.__call__

但(2)

@decorator(some_param)

def func():

...

类似于

# Call of __init__ plus call of __call__

func = decorator(some_param)(func)

# Call of closure returned by decorator.__call__

func(...)

>您已经为(2)语法实现了装饰器接受参数,但在使用它们时不提供它们,如示例(1)所示.这就是为什么__init__抱怨,它接收func作为第二个参数.

>您应该在包装器闭包中编写self.cache,因此包装器将引用相应的装饰器对象.写入缓存将导致全局变量搜索,因此将失败.

UPD:我改变你的代码接近(1):

class memoize:

def __init__(self, function):

self.cache = {}

self.function = function

def __call__(self, *args, **kwargs):

key = str(args) + str(kwargs)

if key in self.cache:

return self.cache[key]

value = self.function(*args, **kwargs)

self.cache[key] = value

return value

@memoize

def fib(n):

if n in (0, 1):

return 1

else:

return fib(n-1) + fib(n-2)

for i in range(0, 10):

print(fib(i))

print(fib.cache)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值