REMOVE ME
Steven D'Aprano
steve at pearwood.info
Mon Apr 11 19:10:54 EDT 2016
On Tue, 12 Apr 2016 08:44 am, John Pote wrote:
> On 10/04/2016 04:52, Chris Angelico wrote:
>> On Sun, Apr 10, 2016 at 1:46 PM, fan nie <niefan68 at gmail.com> wrote:
>>> --
>>> https://mail.python.org/mailman/listinfo/python-list
>> Sure. I presume you mean something like this:
>>
>> class Thing:
>> things = []
>> def __init__(self):
>> self.things.append(self)
>> def __del__(self):
>> # Remove me when I'm dead
>> self.things.remove(self)
>>
>> This ingenious technique guarantees that you never have dead objects
>> in your list, by having each object remove itself when it dies.
>>
>> ChrisA
> I'm not quite sure how tongue in cheek ChrisA's reply and the Thing
> class was
I'm sure it was extremely tongue in cheek.
> but it did make me think and wonder if my understanding of
> Python lore was quite right. To my mind it looks like a Zombie or even
> Revenant class.
>
> If all external references to an instance of Thing are deleted there is
> still the reference from the class list 'things []'. In which case will
> not this prevent the instance from being garbage collected and __del__()
> never called on the dead instance and its memory never released.
Correct.
> But a
> memory dump could reveal the ghost of the instance. On the other hand a
> code wizard with the right lore could resurect the instance by getting
> the reference to it and bring it back to life -
> revenant = Thing.things[x]
>
> But then I notice 'things' is used as an instance attribute rather than
> a class attribute. All seems to be shrouded in a web of mystery
Your first analysis was correct. "self.things" is actually a class
attribute, despite being accessed from "self". The reason being, attribute
lookups look for:
- instance attributes;
- class attributes;
- superclass attributes;
in that order. (This is actually an extremely simplified view, but close
enough for what we're discussing.) Hence "self.things" will return the same
list each time, the one defined as a class attribute, regardless of
which "self" does the lookup.
If a method were to assign to the attribute, for example "self.things = []",
that would create an instance attribute, but that doesn't happen.
--
Steven
More information about the Python-list
mailing list