利用decorator和descriptor进行数据缓存

class cached_property(object):                                                                                                                           

    def __init__(self, func, name=None, doc=None):
        self.__name__ = name or func.__name__
        self.__module__ = func.__module__
        self.__doc__ = doc or func.__doc__
        self.func = func

    def __get__(self, obj, type=None):
        if obj is None:
            return self
        value = obj.__dict__.get(self.__name__, None)
        if value is None:
            value = self.func(obj)
            obj.__dict__[self.__name__] = value
        return value

 

今天在werkzurg上看到上面的代码,写得真是精彩!

 

通常我们descrator是这么写的

def cached_property(func):
    def _(*args, **kwargs):
            return func(*args, **kwargs)
    return _

 

从代码形式上看,这是一个函数调用,返回一个函数,在python语法上decorator为下面的编写方式:

@cached_property
def func():
      return 42

 

而代码的执行方式和cached_property(func)是一样的,这是一种闭包的形式,这种形式和定义一个object,__init__第一个参数是func,之后定义一个__call__是等价的。在werkzurg中采用了前面的方式__init__来获取和decorator相同的行为,而__init__返回的是cached_property对象,这个对象使用__get__这个descriptor特性。

 

当调用@cached_property修饰的属性名称时,便会调用生成的对象的__get__方法,从而可以更加仔细的调用func方法获取具体的值,从而缓存起来!!!

 

对descriptor不熟悉的可以看python文档:http://docs.python.org/2/howto/descriptor.html

 

perfect!

 

 

转载于:https://www.cnblogs.com/ubunoon/p/3229001.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值