@@ -194,6 +194,8 @@ func (g *PythonGenerator) generateClasses(m *manifest.Manifest) (string, error)
194194func (g * PythonGenerator ) generateClass (m * manifest.Manifest , class * manifest.Class ) (string , error ) {
195195 var sb strings.Builder
196196
197+ hasDtor := class .Destructor != ""
198+
197199 // Class declaration with docstring
198200 sb .WriteString (fmt .Sprintf ("class %s:\n " , class .Name ))
199201 if class .Description != "" {
@@ -216,6 +218,14 @@ func (g *PythonGenerator) generateClass(m *manifest.Manifest, class *manifest.Cl
216218 sb .WriteString (" ...\n \n " )
217219 }
218220
221+ // Generate destructor and context manager methods for classes with destructors
222+ if hasDtor {
223+ sb .WriteString (g .generateDestructorMethods (class ))
224+ }
225+
226+ // Generate utility methods (get, release, reset, valid) for all classes
227+ sb .WriteString (g .generateUtilityMethods (class ))
228+
219229 // Generate bindings (methods)
220230 for _ , binding := range class .Bindings {
221231 methodCode , err := g .generateBinding (m , class , & binding )
@@ -229,6 +239,89 @@ func (g *PythonGenerator) generateClass(m *manifest.Manifest, class *manifest.Cl
229239 return sb .String (), nil
230240}
231241
242+ func (g * PythonGenerator ) generateDestructorMethods (class * manifest.Class ) string {
243+ var sb strings.Builder
244+
245+ // __del__ method
246+ sb .WriteString (" def __del__(self) -> None:\n " )
247+ sb .WriteString (" \" \" \" \n " )
248+ sb .WriteString (" Destructor. Releases the underlying handle if owned.\n " )
249+ sb .WriteString (" \" \" \" \n " )
250+ sb .WriteString (" ...\n \n " )
251+
252+ // close method
253+ sb .WriteString (" def close(self) -> None:\n " )
254+ sb .WriteString (" \" \" \" \n " )
255+ sb .WriteString (" Close/destroy the handle if owned.\n " )
256+ sb .WriteString (" \" \" \" \n " )
257+ sb .WriteString (" ...\n \n " )
258+
259+ // __enter__ method for context manager
260+ sb .WriteString (fmt .Sprintf (" def __enter__(self) -> \" %s\" :\n " , class .Name ))
261+ sb .WriteString (" \" \" \" \n " )
262+ sb .WriteString (" Enter the runtime context for this object.\n \n " )
263+ sb .WriteString (" Returns:\n " )
264+ sb .WriteString (fmt .Sprintf (" %s: self\n " , class .Name ))
265+ sb .WriteString (" \" \" \" \n " )
266+ sb .WriteString (" ...\n \n " )
267+
268+ // __exit__ method for context manager
269+ sb .WriteString (" def __exit__(self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: object) -> None:\n " )
270+ sb .WriteString (" \" \" \" \n " )
271+ sb .WriteString (" Exit the runtime context and release resources.\n \n " )
272+ sb .WriteString (" Args:\n " )
273+ sb .WriteString (" exc_type (type[BaseException] | None): Exception type if an exception was raised\n " )
274+ sb .WriteString (" exc_val (BaseException | None): Exception value if an exception was raised\n " )
275+ sb .WriteString (" exc_tb (object): Traceback if an exception was raised\n " )
276+ sb .WriteString (" \" \" \" \n " )
277+ sb .WriteString (" ...\n \n " )
278+
279+ return sb .String ()
280+ }
281+
282+ func (g * PythonGenerator ) generateUtilityMethods (class * manifest.Class ) string {
283+ var sb strings.Builder
284+
285+ // Get the handle type mapped to Python
286+ handleType , _ := g .typeMapper .MapType (class .HandleType , TypeContextReturn , false )
287+
288+ // get() method
289+ sb .WriteString (fmt .Sprintf (" def get(self) -> %s:\n " , handleType ))
290+ sb .WriteString (" \" \" \" \n " )
291+ sb .WriteString (" Get the raw handle value without transferring ownership.\n \n " )
292+ sb .WriteString (" Returns:\n " )
293+ sb .WriteString (fmt .Sprintf (" %s: The underlying handle value\n " , handleType ))
294+ sb .WriteString (" \" \" \" \n " )
295+ sb .WriteString (" ...\n \n " )
296+
297+ // release() method
298+ sb .WriteString (fmt .Sprintf (" def release(self) -> %s:\n " , handleType ))
299+ sb .WriteString (" \" \" \" \n " )
300+ sb .WriteString (" Release ownership of the handle and return it.\n \n " )
301+ sb .WriteString (" Returns:\n " )
302+ sb .WriteString (fmt .Sprintf (" %s: The released handle value\n " , handleType ))
303+ sb .WriteString (" \" \" \" \n " )
304+ sb .WriteString (" ...\n \n " )
305+
306+ // reset() method
307+ sb .WriteString (" def reset(self) -> None:\n " )
308+ sb .WriteString (" \" \" \" \n " )
309+ sb .WriteString (" Reset the handle by closing it.\n " )
310+ sb .WriteString (" \" \" \" \n " )
311+ sb .WriteString (" ...\n \n " )
312+
313+ // valid() method
314+ sb .WriteString (" def valid(self) -> bool:\n " )
315+ sb .WriteString (" \" \" \" \n " )
316+ sb .WriteString (" Check if the handle is valid.\n \n " )
317+ sb .WriteString (" Returns:\n " )
318+ sb .WriteString (" bool: True if the handle is valid, False otherwise\n " )
319+ sb .WriteString (" \" \" \" \n " )
320+ sb .WriteString (" ...\n \n " )
321+
322+ return sb .String ()
323+ }
324+
232325func (g * PythonGenerator ) generateConstructor (m * manifest.Manifest , class * manifest.Class , methodName string ) (string , error ) {
233326 // Find the method in the manifest
234327 var method * manifest.Method
0 commit comments