menu

Junjielee Blog

在平凡中坚持前行,总会遇见不凡的自己

Python描述器-实例方法缓存

什么是Python描述器,其他文章的介绍都比较清晰了,可以查看参考部分。简单概括就是实现了__get__ or __set__ or __delete__方法就是描述器

使用描述器实现缓存

class cached_property(object):
    def __init__(self, func, name=None):
        self.__name__ = name or func.__name__
        self.func = func
        print('init end')

    def __get__(self, obj, _type=None):
        value = self.func(obj)
        obj.__dict__[self.__name__] = value
        print('use __get__')
        return value


class Test(object):

    @cached_property
    def user_info(cls):
        return {'name': 'Python3.7'}

# 执行结果
>> init end
>> use __get__
>> {'name': 'Python3.7'}
>> {'name': 'Python3.7'}

因为初次访问__get__,将value存入 Test 对象的 __dict__里面,再次访问,则直接从__dict__里去取。可以通过修改__get__方法,例如从Redis里取结果,如果没有才调用func方法,来实现Redis缓存

参考

面向对象(深入)|python描述器详解 Python描述器引导(翻译)