how to keep collection of existing instances and return one on instantiation

marduk usenet at marduk.letterboxes.org
Wed Oct 5 13:18:45 EDT 2005


On Wed, 2005-10-05 at 12:56 -0400, Jonathan LaCour wrote:
> > class Spam(object):
> >     cache = {}
> >     def __new__(cls, x):
> >         if cls.cache.has_key(x):
> >             return cls.cache[x]
> >     def __init__(self, x):
> >         self.x = x
> >         self.cache[x] = self
> >
> > a = Spam('foo')
> > b = Spam('foo')
> >
> > Well, in this case a and b are identical... to None!  I assume this is
> > because the test in __new__ fails so it returns None, I need to then
> > create a new Spam.. but how do I do that without calling __new__  
> > again?
> > I can't call __init__ because there's no self...
> >
> >
> 
> Oops, you forgot to return object.__new__(cls, x) in the case the  
> object isn't in the cache.  That should fix it.

Okay, one more question... say I then

c = Spam('bar')
del a
del b

I've removed all references to the object, except for the cache.  Do I
have to implement my own garbage collecting is or there some "magical"
way of doing this within Python?  I pretty much want to get rid of the
cache as soon as there are no other references (other than the cache).




More information about the Python-list mailing list