
class cached_property(object):
    """ Only evaluate once then replace the property object by the value.
    """

    def __get__(self, obj, cls):
        if obj is None:
            return self
        value = obj.__dict__[self.func.__name__] = self.func(obj)
        return value
