class astropy.utils.decorators.lazyproperty(fget, fset=None, fdel=None, doc=None)[source]#

Bases: property

Works similarly to property(), but computes the value only once.

This essentially memorizes the value of the property by storing the result of its computation in the __dict__ of the object instance. This is useful for computing the value of some property that should otherwise be invariant. For example:

>>> class LazyTest:
...     @lazyproperty
...     def complicated_property(self):
...         print('Computing the value for complicated_property...')
...         return 42
>>> lt = LazyTest()
>>> lt.complicated_property
Computing the value for complicated_property...
>>> lt.complicated_property

As the example shows, the second time complicated_property is accessed, the print statement is not executed. Only the return value from the first access off complicated_property is returned.

By default, a setter and deleter are used which simply overwrite and delete, respectively, the value stored in __dict__. Any user-specified setter or deleter is executed before executing these default actions. The one exception is that the default setter is not run if the user setter already sets the new value in __dict__ and returns that value and the returned value is not None.