Created
January 4, 2020 02:34
-
-
Save Grissess/d1ec18916f664efea4cd519974098c11 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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