Skip to content

Instantly share code, notes, and snippets.

@Grissess
Created January 4, 2020 02:34
Show Gist options
  • Save Grissess/d1ec18916f664efea4cd519974098c11 to your computer and use it in GitHub Desktop.
Save Grissess/d1ec18916f664efea4cd519974098c11 to your computer and use it in GitHub Desktop.
class NamedSingletonMeta(type):
def __new__(mcs, name, bases, dict):
tp = type.__new__(mcs, name, bases, dict)
if name != 'NamedSingletonBase':
tp._instances = {}
return tp
def __getitem__(self, i):
return self._instances[i]
def __contains__(self, i):
return i in self._instances
def __setitem__(self, i, v):
self._instances[i] = v
def get(self, k, d=None):
return self._instances.get(k, d)
def clear(self):
self._instances.clear()
__getattr__ = __getitem__
class NamedSingletonBase(object, metaclass=NamedSingletonMeta):
def __new__(mcs, name, *args, **kwargs):
inst = mcs.get(name)
if inst is None:
inst = object.__new__(mcs)
mcs[name] = inst
return inst
def __init__(self, name):
self.name = name
@classmethod
def convert(cls, nm, create=False):
if isinstance(nm, cls):
return nm
if create:
return cls(nm)
return cls[nm]
class NamedSingleton(NamedSingletonBase):
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment