Steven Taschuk staschuk at
Tue Jul 22 02:37:01 CEST 2003

Quoth Michele Simionato:
> Steven Taschuk <staschuk at> wrote in message news:<mailman.1058723911.12956.python-list at>...
> >     _the_instance = None
> >     class MySingleton(object):
> >         def __new__(self):
> >             global _the_instance
> >             if _the_instance is None:
> >                 _the_instance = object.__new__(self)
> >             return _the_instance
> Why are you using a global here and not [a class attribute]

The memory of that thread a little while back about using __del__
with singletons.  If the instance is referenced by a class
attribute, the cyclic reference prevents the __del__ from being
used.  If the cycle goes through a module attribute, though, the
zapping of module dicts during shutdown breaks the cycle and lets
the __del__ run.  (Whether all this is true depends on the version
of Python, I think, but I don't know the details.)

This might be relevant to the OP, whose example was a singleton
representing the single database connection used by an entire
application -- in such a case, __del__ would be a natural place to
make sure the connection is closed properly.

I should have explained this bit of trickery.  :(

> > Second approach: Use a metaclass.  See
> >     <>
> Unfortunately, I see that this recipe is not very recommendable. I have
> just submitted a fix which seems to work:


Steven Taschuk              Aral: "Confusion to the enemy, boy."
staschuk at    Mark: "Turn-about is fair play, sir."
                             -- _Mirror Dance_, Lois McMaster Bujold

More information about the Python-list mailing list