单例模式的机制,确保类有且只有一个特定的对象并且提供全局访问点,在程序运行中只能生成一个实例,因此避免了对同一个资源产生相互冲突的请求。
设计模式示意如下:
1、类只有一个对象创建
2、为对象提供一个访问点,程序可以全局访问这个对象
3、控制共享资源并行访问
实现单例的四种方式:__ new __实现,@classmethod实现,装饰器实现或者导入别的模块来实现
单例模式示意
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class lala(object): def __new__(cls, *args, **kw): 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 __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
|