@@ -56,6 +56,29 @@ class TooManyComputesError(ReactiveError):
5656    """Raised when an attribute has public and private compute methods.""" 
5757
5858
59+ class  Initialize (Generic [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