V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
fanhaipeng0403
V2EX  ›  Python

class property 缓存

  •  
  •   fanhaipeng0403 · 2018-12-30 00:38:18 +08:00 · 1111 次点击
    这是一个创建于 2160 天前的主题,其中的信息可能已经有所发展或是发生改变。
    from threading import RLock
    
    _missing = object()
    
    
    class locked_cached_property(object):
        """A decorator that converts a function into a lazy property.  The
        function wrapped is called the first time to retrieve the result
        and then that calculated result is used the next time you access
        the value.  Works like the one in Werkzeug but has a lock for
        thread safety.
        """
    
        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
            self.lock = RLock()
    
        def __get__(self, obj, type=None):
            if obj is None:
                return self
            with self.lock:
                value = obj.__dict__.get(self.__name__, _missing)
                if value is _missing:
                    value = self.func(obj)
                    obj.__dict__[self.__name__] = value
                return value
                
    
    In [27]: class B:
        ...:     @locked_cached_property
        ...:     def foo(self):
        ...:         import time
        ...:
        ...:         print('processing....')
        ...:         time.sleep(10)
        ...:         return 'b'
        ...:
        ...:
    
    In [28]: b = B()
    
    In [29]: b.foo
    processing....
    Out[29]: 'b'
    
    In [30]: b.foo
    Out[30]: 'b'
    
    In [31]:
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:35 · PVG 14:35 · LAX 22:35 · JFK 01:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.