Why doesn't my finaliser run here?

Ben Finney ben+python at benfinney.id.au
Sun Sep 4 21:48:37 EDT 2016


Steve D'Aprano <steve+python at pearwood.info> writes:

> On Sun, 4 Sep 2016 10:37 pm, Ben Finney wrote:
>
> > Short anser: because nothing has removed the reference to the
> > instance.
>
> Hmmm. You're probably right, but not for the reason you think :-)

Thanks to those who corrected some details in my explanation.

> > This is a good example of why it helps to *never* call ‘__init__’
> > the “constructor”. It isn't, because ‘__init__’ acts on an
> > already-constructed instance.
>
> I don't believe I did call it the constructor :-)

You have advocated that in the past, though :-) I am presenting this as
a counter-example: ‘__init__’ does not act as the constructor, so it's
needlessly misleading to refer to it that way.

> > Right. The instance is constructed successfully (by ‘__new__’, the
> > constructor). It will be bound to ‘s’, creating a reference to the
> > instance.
>
> Bound to `s`? Did you mean `e`?

I did. And yes, that was incorrect: the assignment statement does not
complete because the exception interrupts it. So ‘e’ is not a reference
to the instance.

> So it looks like what may have been holding onto the reference to the
> Eggs instance was the exception or traceback, and once that got
> garbage-collected (by me causing a new exception and traceback) the
> finaliser ran.
>
> Which both Oscar and Chris suggested, thanks guys!

Indeed. Thanks for dissecting the right and wrong parts :-)

The larger point which remains true: Don't think of ‘__init__’ as a
constructor, all it does is work on an *already-constructed* instance.

The ‘__new__’ method is the constructor. The instance doesn't exist
before that method is called; if successful, the instance is constructed
and returned.

The ‘__init__’ method is the initialiser. It receives the
already-constructed instance, and returns ‘None’. That doesn't affect
existing references to the instance.

-- 
 \      “Shepherds … look after their sheep so they can, first, fleece |
  `\   them and second, turn them into meat. That's much more like the |
_o__)      priesthood as I know it.” —Christopher Hitchens, 2008-10-29 |
Ben Finney




More information about the Python-list mailing list