I have this piece of code
import abc
class SingletonABCMeta(abc.ABCMeta):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(SingletonABCMeta, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Cabc(abc.ABC):
__metaclass__ = SingletonABCMeta
@abc.abstractmethod
def foo(self): pass
class C(Cabc):
def __init__(self, a):
print(f"initializing with {a}")
self._a = a
def foo(self):
return self._a
class DoubleC(Cabc):
def __init__(self, a):
print(f"initializing with {a}")
self._a = a
def foo(self):
return self._a * 2
if __name__ == "__main__":
print(C(2).foo())
print(DoubleC(2).foo())
print(C(3).foo())
print(DoubleC(3).foo())
it returns
initializing with 2
2
initializing with 2
4
initializing with 3
3
initializing with 3
6
But I expect it to return
initializing with 2
2
initializing with 2
4
2
4
How do I do this?