Re: does python have useless destructors?

From: Duncan Booth (me_at_privacy.net)
Date: 06/12/04


Date: 12 Jun 2004 13:34:11 GMT


"Roger Binns" <rogerb@rogerbinns.com> wrote in
news:q3ipp1-4bp.ln1@home.rogerbinns.com:

> Duncan Booth wrote:
>> The object itself can know that it needs to be safely disposed of,
>> but it cannot tell *when* to dispose of itself. My example function
>> might create multiple objects some of which need disposing when the
>> function returns, and others have a longer lifetime. The choice
>> between disposing at the end of the function or when some containing
>> object is disposed has to be one for the caller.
>
> You have totally confused me now. Ignoring special cases such as
> cycles, Python destructs an object when there are no references left
> to it, and in CPython that happens at the moment the last reference is
> released. So in normal code the objects will go away as names
> referencing them go out of scope.

I wouldn't say that cycles are special cases exactly.

C Python destroys an object when no references are left. Jython and
IronPython destroy objects when the underlying garbage collector feels like
it (i.e. when the object is no longer reachable, which even without cycles
is not the same as having no references). In most, if not all of these
cases the underlying garbage collector is generational, so you can't even
be sure that unreachable objects will be destroyed by the next collection,
it may take several collections. Python (as a language) is careful not to
specify a specific implementation (such as reference counting) because that
would prevent efficient implementation on a variety of platforms.

>
> If the Python object is a proxy for another non-Python visible object
> (such as a C level filehandle or GUI Window). In those cases
> the extension module author has to deal with the situation, either by
> adding an extra reference (the C level object is then the remaining
> reference) or handling the lifetime of the C level object
> independently.
>
> But for this thread, the actual problem is that __del__ methods may
> not be called on objects, and if you read the doc implies they almost
> never will be called. So we have the counter-intuitive (and IMHO user
> hostile) situation where someone marks a class as needing extra code
> to run to destroy it, and Python addresses that by saying you will
> be lucky if the object will be destroyed (ie by not destroying the
> object).

No, Python guarantees that the object will (almost always) be destroyed. It
just doesn't make guarantees about when that will happen. If you want
guarantees about resources being released you have to write the code to do
that yourself (e.g. with try..finally). The same applies for other
languages such as Java, or languages running in Microsoft's .Net framework.

Guaranteeing that all resources will be released at a specific time has
implications for performance, and finalisers are actually pretty rare in
practice, so the usual solution is to compromise.



Relevant Pages

  • Re: does python have useless destructors?
    ... The choice between disposing at the end ... and in CPython that happens at the moment the last reference is released. ... to run to destroy it, and Python addresses that by saying you will ... I certainly agree that dealing with destructors from a language ...
    (comp.lang.python)
  • Re: Finding the instance reference of an object [long and probably boring]
    ... See, Python is call-by-reference!!! ... on "tricks" and indirect techniques as in the Python code above? ... trouble when, instead of assigning 1, you are assigning (a reference ... "Person foo;" declares a person reference. ...
    (comp.lang.python)
  • Re: Pythons garbage collection was Re: Python reliability
    ... >>> Has anyone looked into using a real GC for python? ... A strategy based on PURE reference counting just ... > extensions, and with correct implementations, both refcounting and GC are ... > Lucky those existing C libraries were written to use python's refcounting! ...
    (comp.lang.python)
  • More than you ever wanted to know about objects [was: Is everything a refrence or isnt it]
    ... Python has features for "introspection", which means that programs can examine the structure of the data rather than only dealing with values of known structure. ... C Python keeps a count of references to all objects, and when the reference count falls to zero it reclaims the ... Under the hood the interpreter looks for an attribute called "method" in the instance. ... If the type is defined as a specialisation of some other type (a "subclass" of the other type - "type2 is like type1 but with the following differences") then the interpreter will consult the other type, and so on and so on. ...
    (comp.lang.python)
  • Re: Finding the instance reference of an object
    ... in the Python docs, yet many here seem to want to deny it. ... Python names are references -- it's all over the place, from any discussion of "reference counting" to understanding the basics of what "a = b" does. ... This is a basic and fundamental thing that a programmer of a language should know. ... referring to a Bar. ...
    (comp.lang.python)