En Sat, 06 Jun 2009 03:03:34 -0300, <s0s...@gmail.com> escribió:
On Jun 5, 8:56 pm, Robert Dailey <rcdai...@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

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to