单例模式的机制,确保类有且只有一个特定的对象并且提供全局访问点,在程序运行中只能生成一个实例,因此避免了对同一个资源产生相互冲突的请求。

设计模式示意如下:

1、类只有一个对象创建
2、为对象提供一个访问点,程序可以全局访问这个对象
3、控制共享资源并行访问

实现单例的四种方式:__ new __实现,@classmethod实现,装饰器实现或者导入别的模块来实现

单例模式示意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#实例化一个对象需要先执行类中的__new__方法来实例化对象,然后再执行类中的__init__方法初始化属性。我们通过这个方法来实现单例模式
class lala(object):
def __new__(cls, *args, **kw): #cls类本身
if not hasattr(cls, '_instance'):
cls._instance = object.__new__(cls, *args, **kw) #*元组 **字典
return cls._instance


sss = lala()
sss2 = lala()
print(sss, sss2)
#可以看到,两个对象其实指向同一个地址
>>><__main__.lala object at 0x00000176220CE460>
>>> <__main__.lala object at 0x00000176220CE460>

装饰器单例类(装饰器实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class LOL(object):
def __new__(cls, *args, **kw):
return LOL


@LOL
class CF(object):
__instance = 'lala'
# def __init__(self):
# pass
def __new__(cls, *args, **kw):
if not hasattr(cls,'lala'):
cls.__instance = object.__new__(cls, *args, **kw)
print('装饰成功')
return cls.__instance

adc = CF()
apc = CF()

print(id(adc),id(apc))
>>>2109347853280 2109347853280

装饰函数单例(函数实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def Single(cls):
_instance = {}

def _singleton(*arg, **kw):
if cls not in _instance:
_instance[cls] = cls(*arg, **kw)
return _instance[cls] #返回实例

return _singleton


@Single
class CF(object):
def __new__(cls, *args, **kw):
if not hasattr(cls,'_instance'):
cls.__instance = object.__new__(cls)
return cls.__instance

adc = CF()
apc = CF()

print(id(adc),id(apc))
>>>1685306759968 1685306759968

使用__ new __方法实现单例类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#一个装饰器单例类
class LOL(object):
def __new__(cls, *args, **kw):
return LOL


@LOL
class CF(object):
def __new__(cls, *args, **kw):
if not hasattr(cls,'_instance'):
cls.__instance = object.__new__(cls)
return cls.__instance

adc = CF()
apc = CF()

print(id(adc),id(apc))
>>>1661381043136 1661381043136