单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
调用方法,不产生新对象 使用同一块系统空间
方法一:创建一个类的私有变量,用来保存第一次开辟内存空间的地址,再之后每次使用__init__时,将私有变量保存地址————>init(self)----->创建的对象
class Singleton:
# 私有化 单例的地址就储存在 __instance
__instance = None
name = 'Jack'
# 重写 __new__
# __new__开辟空间,__init__初始化对象 ——不产生实例——>阻止__new__ 返回 __init__方法
def __new__(cls):
# print("------new")
if cls.__instance is None:
# print("------>1")
cls.__instance = object.__new__(cls)
# print(cls.__instance)
# return cls.__instance
# else:
# print("------->2")
# return cls.__instance
return cls.__instance
def show(self):
print("-------->show",Singleton.name)
s = Singleton()
s1 = Singleton()
print(s)
print(s1)
s.show()
运行结果:
<main.Singleton object at 0x0000022DD1FCEDC0>
<main.Singleton object at 0x0000022DD1FCEDC0>
-------->show Jack
方法二:使用装饰器
def singleton(cls, *args, **kw):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return _singleton()
@singleton
class Myclass:
pass
s = Myclass
s1 = Myclass
print(s)
print(s1)
运行结果:
<main.Myclass object at 0x0000020D1413EEE0>
<main.Myclass object at 0x0000020D1413EEE0>