@@ -56,6 +56,29 @@ class TooManyComputesError(ReactiveError):
5656 """Raised when an attribute has public and private compute methods."""
5757
5858
59+ class Initialize (Generic [ReactableType , ReactiveType ]):
60+ """Initialize a reactive by calling a method parent object.
61+
62+ Example:
63+ ```python
64+ class InitializeApp(App):
65+
66+ def get_names(self) -> list[str]:
67+ return ["foo", "bar", "baz"]
68+
69+ # The `names` property will call `get_names` to get its default when first referenced.
70+ names = reactive(Initialize(get_names))
71+ ```
72+
73+ """
74+
75+ def __init__ (self , callback : Callable [[ReactableType ], ReactiveType ]) -> None :
76+ self .callback = callback
77+
78+ def __call__ (self , obj : ReactableType ) -> ReactiveType :
79+ return self .callback (obj )
80+
81+
5982async def await_watcher (obj : Reactable , awaitable : Awaitable [object ]) -> None :
6083 """Coroutine to await an awaitable returned from a watcher"""
6184 _rich_traceback_omit = True
@@ -118,7 +141,7 @@ class Reactive(Generic[ReactiveType]):
118141
119142 def __init__ (
120143 self ,
121- default : ReactiveType | Callable [[], ReactiveType ],
144+ default : ReactiveType | Callable [[], ReactiveType ] | Initialize [ ReactiveType ] ,
122145 * ,
123146 layout : bool = False ,
124147 repaint : bool = True ,
@@ -190,7 +213,11 @@ def _initialize_reactive(self, obj: Reactable, name: str) -> None:
190213 else :
191214 default_or_callable = self ._default
192215 default = (
193- default_or_callable ()
216+ (
217+ default_or_callable (obj )
218+ if isinstance (default_or_callable , Initialize )
219+ else default_or_callable ()
220+ )
194221 if callable (default_or_callable )
195222 else default_or_callable
196223 )
@@ -421,7 +448,7 @@ class reactive(Reactive[ReactiveType]):
421448
422449 def __init__ (
423450 self ,
424- default : ReactiveType | Callable [[], ReactiveType ],
451+ default : ReactiveType | Callable [[], ReactiveType ] | Initialize [ ReactiveType ] ,
425452 * ,
426453 layout : bool = False ,
427454 repaint : bool = True ,
@@ -456,7 +483,7 @@ class var(Reactive[ReactiveType]):
456483
457484 def __init__ (
458485 self ,
459- default : ReactiveType | Callable [[], ReactiveType ],
486+ default : ReactiveType | Callable [[], ReactiveType ] | Initialize [ ReactiveType ] ,
460487 init : bool = True ,
461488 always_update : bool = False ,
462489 bindings : bool = False ,
0 commit comments