Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1"""Object Utilities.""" 

2from __future__ import absolute_import, unicode_literals 

3 

4 

5class cached_property(object): 

6 """Cached property descriptor. 

7 

8 Caches the return value of the get method on first call. 

9 

10 Examples: 

11 .. code-block:: python 

12 

13 @cached_property 

14 def connection(self): 

15 return Connection() 

16 

17 @connection.setter # Prepares stored value 

18 def connection(self, value): 

19 if value is None: 

20 raise TypeError('Connection must be a connection') 

21 return value 

22 

23 @connection.deleter 

24 def connection(self, value): 

25 # Additional action to do at del(self.attr) 

26 if value is not None: 

27 print('Connection {0!r} deleted'.format(value) 

28 """ 

29 

30 def __init__(self, fget=None, fset=None, fdel=None, doc=None): 

31 self.__get = fget 

32 self.__set = fset 

33 self.__del = fdel 

34 self.__doc__ = doc or fget.__doc__ 

35 self.__name__ = fget.__name__ 

36 self.__module__ = fget.__module__ 

37 

38 def __get__(self, obj, type=None): 

39 if obj is None: 

40 return self 

41 try: 

42 return obj.__dict__[self.__name__] 

43 except KeyError: 

44 value = obj.__dict__[self.__name__] = self.__get(obj) 

45 return value 

46 

47 def __set__(self, obj, value): 

48 if obj is None: 

49 return self 

50 if self.__set is not None: 

51 value = self.__set(obj, value) 

52 obj.__dict__[self.__name__] = value 

53 

54 def __delete__(self, obj, _sentinel=object()): 

55 if obj is None: 

56 return self 

57 value = obj.__dict__.pop(self.__name__, _sentinel) 

58 if self.__del is not None and value is not _sentinel: 

59 self.__del(obj, value) 

60 

61 def setter(self, fset): 

62 return self.__class__(self.__get, fset, self.__del) 

63 

64 def deleter(self, fdel): 

65 return self.__class__(self.__get, self.__set, fdel)