单例模式(Singleton Pattern)
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例
基于装饰器实现
def singleton(cls):
__instance = {}
def __singleton(*args, **kwargs):
if cls not in __instance:
__instance[cls] = cls(*args, **kwargs)
return __instance[cls]
return __singleton
@singleton
class Foo():
pass
class Bar():
pass
if __name__ == "__main__":
foo1 = Foo() # <__main__.Foo object at 0x0000026991E5E3C8>
foo2 = Foo() # <__main__.Foo object at 0x0000026991E5E3C8>
bar1 = Bar() # <__main__.Bar object at 0x0000026991E5E438>
bar2 = Bar() # <__main__.Bar object at 0x0000026991E5E470>
基于类的“魔术方法” __new__实现
class Singleton:
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = object.__new__(cls, *args, **kwargs)
# 当存在父类时, 可使用super().__new__()实例化
# cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
if __name__ == "__main__":
for i in range(5):
instance = Singleton()
print(instance)
# <__main__.Singleton object at 0x00000242C5962160>
# <__main__.Singleton object at 0x00000242C5962160>
# <__main__.Singleton object at 0x00000242C5962160>
# <__main__.Singleton object at 0x00000242C5962160>
# <__main__.Singleton object at 0x00000242C5962160>