Randy Turner wrote: > I was reading a book on Python-3 programming recently and the book stated > that, while there is an __init__ method for initializing objects, there was a > __del__ method but the __del__ method is not guaranteed to be called when an > object is destroyed. > > If there is code in the __init__ method that allocates resources (memory, > file opens, etc.), how do these resources get cleaned up when an object is > destroyed? Custom method? > > At the moment, this architecture seems a bit asymmetric if the __del__ method > is not called.
The issue isn't as pressing as you may think. __init__() and __del__() aren't the constructor and destructor of an object. They are the initializer and finalizer of an object. The constructor is the __new__ function of a type. It's possible to construct an object without having it's __init__() method called. Since resources like memory, file handles and other stuff are usually handled in C code, the type definition provides a rich set of API methods. Objects that deal with resources like e.g. a database connection are usually implemented in C, too. I suggest that you read up the functions here: http://docs.python.org/c-api/typeobj.html#tp_new http://docs.python.org/c-api/typeobj.html#tp_init http://docs.python.org/c-api/typeobj.html#tp_alloc http://docs.python.org/c-api/typeobj.html#tp_dealloc http://docs.python.org/c-api/typeobj.html#tp_free __del__ is only problematic when the object is part of a reference cycle. When the object isn't or can't be part of a cycle the __del__ method is called. -- http://mail.python.org/mailman/listinfo/python-list