1 概述
顾名思义,单例模式(singleton)就是一个类只有一个实例。
保证一个类只有一个实例,并提供一个访问它的全局访问点。
优点
对唯一实例的受控访问
单例相当于全局变量,防止了命名空间被污染
2 代码实现
方式一
class Singleton:
def __new__(cls, *args, **kwargs):
"""
实例化一个对象,开辟一块空间存储这块对象
"""
if not hasattr(cls,'_instance'): # 如果没有_instance类属性
# 等同于 setattr('_instance',object.__new__(Singleton))
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
class CountNum(Singleton):
def __init__(self,v=0):
self.v = v
def incr(self):
self.v += 1
if __name__ == '__main__':
c1 = CountNum()
c2 = CountNum()
c1.incr()
c2.incr()
c1.incr()
c2.incr()
print(f'计数值:{c1.v}')
print(f'c1 的地址是:{id(c1)}')
print(f'c2 的地址是:{id(c2)}')
"""
OUT:
计数值:4
c1 的地址是:2985030551152
c2 的地址是:2985030551152
"""
方式n:还有不同的方式控制单例,我个人喜欢这种方式
3 使用场景
对于网页日志这种场景必须使用单例模式,因为不同的网页请求必须使用同一套日志。
对于计数场景也不能使用两个实例。