- __new__ special methods to achieve
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, name):
self.name = name
s1 = Singleton('first')
s2= Singleton('last')
print(s1 == s2)
>> True
print(s1.name)
>> last
tips: __new__ method can not be avoided trigger the init (), the initial members of the variable will be covered
- Decorators achieve
def singleton(cls):
_instance = {}
def inner(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return inner
@singleton
class Test:
def __init__(self, name):
self.name = name
t1 = Test('first')
t2 = Test('last')
print(t1==t2)
>> True
print(t2.name)
>> first