__init__ vs. __del__
Christian Heimes
lists at cheimes.de
Sat Mar 21 21:37:38 EDT 2009
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.
More information about the Python-list
mailing list