<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def memoized_property(func=None, key_factory=per_instance, **kwargs):
 """A convenience wrapper for memoizing properties. Applied like so: Is equivalent to: Which is equivalent to: By default a deleter for the property is setup that un-caches the property such that a subsequent property access re-computes the value. In other words, for this `now` @memoized_property: You could write code like so: 1433267312.622095 1433267312.622095 1433267424.056189 1433267424.056189 :API: public :param func: The property getter method to wrap. Only generally passed by the python runtime and should be omitted when passing a custom `key_factory` or `cache_factory`. :param key_factory: A function that can form a cache key from the arguments passed to the wrapped, memoized function; by default `per_instance`. :param kwargs: Any extra keyword args accepted by `memoized`. :raises: `ValueError` if the wrapper is applied to anything other than a function. :returns: A read-only property that memoizes its calculated value and un-caches its value when `del`ed. """

  getter = memoized_method(func=func, key_factory=key_factory, **kwargs)
  return property(fget=getter, fdel=lambda self: getter.forget(self))