def single(cls):
cls.instance = None
def wrapper(*args, **kwargs):
if not cls.instance:
cls.instance = cls(*args, **kwargs)
return cls.instance
return wrapper
@single
class A:
pass
@single
class B:
pass
a1 = A()
a2 = A()
b1 = B()
b2 = B()
print(a1, a2)
print(b1, b2)
class Single:
def __init__(self, cls):
self.cls = cls
self.cls.instance = None
def __call__(self, *args, **kwargs):
if not self.cls.instance:
self.cls.instance = self.cls(*args, **kwargs)
return self.cls.instance
@Single
class A:
pass
@Single
class B:
pass
a1 = A()
a2 = A()
b1 = B()
b2 = B()
print(a1, a2)
print(b1, b2)