multi-Singleton-like using __new__
Arnaud Delobelle
arnodel at googlemail.com
Sat Feb 9 07:24:36 EST 2008
On Feb 9, 1:38 am, Freek Dijkstra <fr... at macfreek.nl> wrote:
> J Peyret wrote:
[...]
> I'll use __metaclass__ solution. Here is my (non-threaded) version:
Great! There's nothing voodoo about metaclasses.
> class RDFObject(object):
> _cache = {} # class variable is shared among all RDFObject
> instances
> class __metaclass__(type):
> def __call__(cls, *args, **kwargs):
> return cls.__new__(cls, *args, **kwargs)
> def __new__(cls, uri, *args, **kargs):
> if uri not in cls._cache:
> obj = object.__new__(cls)
> cls._cache[uri] = obj
> obj.__init__(uri, *args, **kargs)
> return cls._cache[uri]
> def __init__(self, uri):
> self.uri = uri
> print self.__class__, uri
> # ...
[...]
> Perhaps indeed the try...except KeyError is even prettier (no idea
> about speed, but let's rename this thread if we want to discuss
> performance measurements).
I would go for something like (untested):
def __new__(cls, uri, *args, **kwargs):
obj = cls._cache.get(uri, None):
if obj is None:
obj = cls._cache[uri] = object.__new__(cls)
obj.__init__(uri, *args, **kwargs)
return obj
It doesn't look up the cache sho much and I think reads just as well.
--
Arnaud
More information about the Python-list
mailing list