Source code for cutcutcodec.core.opti.cache.singleton

"""Allow to create only one instance of an object."""

from .hashable import hashable


[docs] class MetaSingleton(type): """For share memory inside the current session. Notes ----- The arguments needs to be hashable. Examples -------- >>> from cutcutcodec.core.opti.cache.singleton import MetaSingleton >>> class A: ... pass ... >>> class B(metaclass=MetaSingleton): ... pass ... >>> class C(metaclass=MetaSingleton): ... def __init__(self, *args, **kwargs): ... self.args = args ... self.kwargs = kwargs ... >>> A() is A() False >>> B() is B() True >>> C(0) is C(0) True >>> C(0) is C(1) False >>> """ instances: dict = {} def __call__(cls, *args, **kwargs): """Create a new class only if it is not already instanciated.""" signature = (cls, hashable(args), hashable(tuple((k, kwargs[k]) for k in sorted(kwargs)))) if signature not in MetaSingleton.instances: instance = cls.__new__(cls) instance.__init__(*args, **kwargs) MetaSingleton.instances[signature] = instance return MetaSingleton.instances[signature]