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

Jonathan LaCour jonathan-lists at
Wed Oct 5 18:56:18 CEST 2005

> 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.


More information about the Python-list mailing list