2008-02-06 18:39:07 +00:00

37 lines
1.2 KiB
Python

class KeyedInstance(object):
"""A class whose instances have a unique identifier of some sort
No two instances with the same unique ID should exist - if we try to create
a second instance, the first should be returned.
"""
# _instances[class][instance]
_instances=dict()
def __new__(cls,*p,**k):
instances = cls._instances
clskey = str(cls)
if clskey not in instances:
instances[clskey] = dict()
instances = instances[clskey]
key = cls._key(*p,**k)
if key not in instances:
instances[key] = super(KeyedInstance,cls).__new__(cls,*p,**k)
self = instances[key]
return self
@classmethod
def _key(cls,*p,**k):
"""Given a unique identifier, return a dictionary key
This should be overridden by child classes, to specify which parameters
should determine an object's uniqueness
"""
raise NotImplementedError()
@classmethod
def clear(cls,cls2=None):
# Allow cls.clear() as well as niqueInstance.clear(cls)
if cls2 is not None:
cls=cls2
if str(cls) in cls._instances:
del cls._instances[str(cls)]