Scope objects

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sat Jun 6 11:44:47 CEST 2009


En Sat, 06 Jun 2009 03:03:34 -0300, <s0suk3 at gmail.com> escribió:
> On Jun 5, 8:56 pm, Robert Dailey <rcdai... at gmail.com> wrote:

>> Is it possible to create an object in Python that will clean itself up
>> at function exit? I realize destruction of objects may not occur
>> immediately and can be garbage collected, but this functionality would
>> still be great to have.
>
> I don't know what you mean by:
>
> "I realize destruction of objects may not occur immediately and can be
> garbage collected"
>
> Aren't you just missing ordinary destructors (__del__() methods)?
> These are closest to C++ destructors AFAICS. As far as I know, these
> are guaranteed to be called when an object goes out of scope. (Note
> that destruction and garbage collection are different operations; an
> object may be destructed without being immediately garbage-collected
> afterwards.)

No, that's not how it works in Python (and I think you're mistaken for C++  
too).
See http://docs.python.org/reference/datamodel.html and specially  
http://docs.python.org/reference/datamodel.html#object.__del__

"Objects are never explicitly destroyed; however, when they become  
unreachable they may be garbage-collected. An implementation is allowed to  
postpone garbage collection or omit it altogether."

CPython uses a "reference count" scheme - an object is destroyed as soon  
as it loses its last reference. Other implementations may choose another  
strategy - in fact, Jython relies on garbage collection instead; object  
destruction may be delayed an arbitrary amount of time. (CPython has a  
garbage collector too, but its purpose is to detect and break object  
cycles.)

So the OP is right - you can't rely on object destruction to perform any  
cleanup; use try/finally or a with statement instead.


>>>> import sys
>>>> class Simple:
> ...     def __init__(self): sys.stdout.write("Simple.__init__()\n")
> ...     def __del__(self):  sys.stdout.write("Simple.__del__()\n")
> ...
>>>> def f():
> ...     s = Simple()
> ...     sys.stdout.write("f()\n")
> ...     # 's' now going out of scope...
> ...
>>>> f()
> Simple.__init__()
> f()
> Simple.__del__()

This behaviour isn't guaranteed and you should not rely on it. Also, try  
again with:

def f():
   s = Simple()
   t = Simple()
   s.x = t
   t.x = s
   sys.stdout.write("f()\n")

-- 
Gabriel Genellina




More information about the Python-list mailing list