__del__ not called?

Duncan Booth duncan.booth at invalid.invalid
Mon Mar 13 03:40:15 EST 2006


Gregor Horvath wrote:

> #!/usr/bin/python
> class A(object):
>    def __init__(self):
>      print "init"
> 
>    def __del__(self):
>      print "del"
> 
> test1.py
> 
> #!/usr/bin/python
> import test
> 
> class B(object):
>    a = test.A()
> 
> Running test1.py outputs:
> 
> init
> 
> the "del" is missing.
> 
> I suppose the a object should be garbage collected!?

No, Python doesn't run the garbage collector when it is exiting. What it 
does is to delete all the globals from each module in turn. So:

C:\Python24>python
Python 2.4.2c1 (#66, Sep 21 2005, 15:16:11) [MSC v.1310 32 bit (Intel)] on 
win32

Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...    def __init__(self):
...      print "init"
...    def __del__(self):
...      print "del called"
...
>>> a = A()
init
>>> ^Z

del called

C:\Python24>

In this case the del method is called as 'a' is deleted, but if you create 
a circular reference a does not get destroyed:

>>> class A(object):
...    def __init__(self):
...      print "init"
...    def __del__(self):
...      print "del called"
...
>>> a = A()
init
>>> a.ref = a
>>> ^Z


C:\Python24>

What is less obvious is that new style classes always include circular 
references, so a class is never detroyed until the garbage collector runs. 
A.__mro__ is a tuple which includes A, and there is probably something else 
I've forgotten (for an empty and otherwise unreferenced class 
getrefcount(oldstyleclass) returns 2, getrefcount(newstyleclass) returns 
5).

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.



More information about the Python-list mailing list