推荐学习书目
› 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 · Dec 30, 2018 · 1687 views
    This topic created in 2826 days ago, the information mentioned may be changed or developed.
    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]:
    
    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1005 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:10 · PVG 07:10 · LAX 16:10 · JFK 19:10
    ♥ Do have faith in what you're doing.