1 # -*- coding: utf-8 -*-
3 __author__
= 'Daniel Greenfeld'
4 __email__
= 'pydanny@gmail.com'
11 class cached_property(object):
12 """ A property that is only computed once per instance and then replaces
13 itself with an ordinary attribute. Deleting the attribute resets the
16 Source: https://github.com/bottlepy/bottle/commit/fa7733e075da0d790d809aa3d2f53071897e6f76
19 def __init__(self
, func
):
20 self
.__doc
__ = getattr(func
, '__doc__')
23 def __get__(self
, obj
, cls
):
26 value
= obj
.__dict
__[self
.func
.__name
__] = self
.func(obj
)
30 class threaded_cached_property(cached_property
):
31 """ A cached_property version for use in environments where multiple
32 threads might concurrently try to access the property.
34 def __init__(self
, func
):
35 super(threaded_cached_property
, self
).__init
__(func
)
36 self
.lock
= threading
.RLock()
38 def __get__(self
, obj
, cls
):
40 # Double check if the value was computed before the lock was
42 prop_name
= self
.func
.__name
__
43 if prop_name
in obj
.__dict
__:
44 return obj
.__dict
__[prop_name
]
46 # If not, do the calculation and release the lock.
47 return super(threaded_cached_property
, self
).__get
__(obj
, cls
)