diff --git a/asyncstdlib/functools.py b/asyncstdlib/functools.py
index 5bd874c..1e33091 100644
--- a/asyncstdlib/functools.py
+++ b/asyncstdlib/functools.py
@@ -116,14 +116,9 @@ class CachedProperty:
         return self._get_attribute(instance)
 
     async def _get_attribute(self, instance) -> T:
-        attributes = instance.__dict__
-        try:
-            return attributes[self._name]
-        except KeyError:
-            value = await self.__wrapped__(instance)
-            if self._name not in attributes:
-                attributes[self._name] = AwaitableValue(value)
-            return value
+        value = await self.__wrapped__(instance)
+        instance.__dict__[self._name] = AwaitableValue(value)
+        return value
 
 
 cached_property = CachedProperty

diff --git a/unittests/test_functools.py b/unittests/test_functools.py
index d8257f5..9d13530 100644
--- a/unittests/test_functools.py
+++ b/unittests/test_functools.py
@@ -35,12 +35,11 @@ async def test_cache_property_nodict():
             __slots__ = "a", "b"
 
             def __init__(self, a, b):
-                self.a = a
-                self.b = b
+                pass  # pragma: no cover
 
             @a.cached_property
             async def total(self):
-                return self.a + self.b
+                pass  # pragma: no cover
 
 
 @multi_sync
@@ -62,7 +61,7 @@ async def test_cache_property_order():
     val = Value(0)
     await Schedule(check_increment(5), check_increment(12), check_increment(1337))
     assert (await val.cached) != 0
-    assert (await val.cached) == 5  # first value fetched
+    assert (await val.cached) == 1337  # last value fetched
 
 
 @sync

Check functools.cached_property return value nesting
The handling of the return value in `functools.cached_property` appears to be too deeply/shallowly nested with awaitables. Wrapping of the original method means:

- `__wrapped__` is of type `(Self) -> await T`
- `value = await self.__wrapped__(instance)` is of type `T`
- `attributes[self._name] = AwaitableValue(value)` is of type `await T`

Now here comes the problem: The helper method has two `return` paths, one for `return value` (``... -> T``) and one for `return attributes[self._name]` (``... -> await T``)! It cannot be correct for both paths.

I assume the latter path is dead in the unit-tests, and I'm somewhat sure it cannot ever be reached. Either way, this should be tested and if necessary fixed or cleaned up.
unittests/test_functools.py::test_cache_property_order
unittests/test_functools.py::test_cached_property unittests/test_functools.py::test_cache_property_nodict unittests/test_functools.py::test_reduce unittests/test_functools.py::test_reduce_misuse unittests/test_functools.py::test_lru_cache_bounded unittests/test_functools.py::test_lru_cache_unbounded unittests/test_functools.py::test_lru_cache_empty unittests/test_functools.py::test_lru_cache_typed unittests/test_functools.py::test_lru_cache_bare unittests/test_functools.py::test_lru_cache_misuse unittests/test_functools.py::test_lru_cache_concurrent[16] unittests/test_functools.py::test_lru_cache_concurrent[None] unittests/test_functools.py::test_cache unittests/test_functools.py::test_caches_metadata[cache-None] unittests/test_functools.py::test_caches_metadata[<lambda>-None] unittests/test_functools.py::test_caches_metadata[<lambda>-0] unittests/test_functools.py::test_caches_metadata[<lambda>-1] unittests/test_functools.py::test_caches_metadata[<lambda>-256]