from functools import wraps
class Foo1(object):
"""单例模式 1 使用类方法"""
__instance = None
@classmethod
def instance(cls):
if cls.__instance:
return cls.__instance
else:
obj = cls()
cls.__instance = obj
return cls.__instance
def test1():
obj1 = Foo1.instance()
obj2 = Foo1.instance()
# id相同
print(f'id(obj1)={id(obj1)}/id(obj2)={id(obj2)}')
class Foo2(object):
"""单例模式 2 基于__new__方法实现"""
__instance = None
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if cls.__instance:
return cls.__instance
else:
obj = object.__new__(cls)
cls.__instance = obj
return cls.__instance
def test2():
obj1 = Foo2()
obj2 = Foo2()
# id相同
print(f'id(obj1)={id(obj1)}/id(obj2)={id(obj2)}')
def Singleton(cls):
_instance = {}
@wraps(cls)
def _singleton(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return _singleton
@Singleton
class Foo3(object):
"""单例模式 3 基于装饰器"""
count = 0
def __new__(cls, *args, **kwargs):
cls.count += 1
def __init__(self):
pass
def test3():
obj1 = Foo3()
obj2 = Foo3()
# id相同
print(f'id(obj1)={id(obj1)}/id(obj2)={id(obj2)}')
if __name__ == '__main__':
test1()
test2()
test3()