单例模式是什么
该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,
某个类只能出现一个实例时,单例对象就能派上用场。
单例模式的实现方式
1.通过模块
class Test:
def foo(self):
pass
test = Test()
# 新建MyTest.py文件
from MyTest import test
test.foo()
2. 使用__new__
'''
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
https://blog.csdn.net/qq_41020281/article/details/79638370
'''
class MyTest(object):
def __new__(cls):
if not hasattr(cls,'instance'):
cls.instance = super().__new__(cls)
return cls.instance
if __name__ == "__main__":
c1 = MyTest()
c2 = MyTest()
print(c1 == c2)
3. 使用装饰器实现单例模式
def singleton(cls):
instances = {}
def getinstance(*args,**kwargs):
# 判断cls是否在字典中:
if cls not in instances:
# 不存在则创建
instances[cls] = cls(*args,**kwargs)
return instances[cls]
return getinstance
@singleton
class MyTest:
a = 1
if __name__ == "__main__":
c1 = MyTest()
c2 = MyTest()
print(c1 == c2)
4. 静态方法实现
class Singleton(object):
def __init__(self):
pass
@classmethod
def instance(cls,*args,**kwargs):
if not hasattr(cls,'_instance'):
cls._instance = Singleton(*args,**kwargs)
return cls._instance
if __name__ == "__main__":
c1 = Singleton.instance()
c2 = Singleton.instance()
print(c1 is c2)