docs: def memoized_property(fget):
      """Decorator to create memoized properties."""
      attr_name = '_{}'.format(fget.__name__)
  
      @functools.wraps(fget)
      def fget_memoized(self):
          if not hasattr(self, attr_name):
              setattr(self, attr_name, fget(self))
          return getattr(self, attr_name)
      return property(fget_memoized)