Gregor Horvath wrote: >> Of course, if your __del__ method actually does get invoked during >> program exit you have to be pretty careful what you do: the chances >> are any global variables you used in __del__ have already been >> destroyed in particular any modules you imported may have been >> deleted. In short, don't rely on anything much being possible from >> __del__ called this way. > > I wanted to close a database connection, which is opend by __init__. > > But what happens to my database connection (instance attributes of A) > when __del__ is never called? >
First off, never depend on __del__ to do anything critical. The only guarantee about the __del__ method on an object is that it will be called zero, one, or more times. (Admittedly you have to work a bit to get it called more than once.) If you have a resource which absolutely must be tidied up, then always put the code which accesses that resource inside a try..finally construct. If it is something pretty global to your program than that try..finally might have to be at the outermost level of your program: try: main() finally: cleanup() (In Python 2.5 you will be able to use a 'with' construct instead, but unfortunately we still have to wait a bit for that to become common usage). Without knowing more about the specific database connection, I can't tell you what happens if you don't explicitly close it. I would hope that it will tidy itself up, but if your code keeps anything cached locally to be written out then obviously that might not get written. If the database supports transactions (and it should), then I would expect anything modified in a transaction which has been commited will be written correctly, and everything modified in a transaction which has not been commited will be discarded: closing (or not) the database should be pretty well irrelevant. -- http://mail.python.org/mailman/listinfo/python-list