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)]