转自本人旧博客
title: python之单例模式
date: 2018-07-04 17:19:53
tags:
- 单例模式保证了在程序的不同位置都可以且仅可以取到同一个对象实例,如果实例不存在,会创建一个实例
使用函数装饰器实现
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class Cls(object):
def __init__(self):
pass
cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))
- 输出True,说明指向了同一个对象
- 使用不可变的类地址作为键,其实例作为值,每次创造实例时,首先查看该类是否存在实例,存在直接返回该实例,否则新建一个实例并存放在字典中。
使用类装饰器实现单例
class Singleton(object):
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls()
return self._instance[self._cls]
@Singleton
class Cls2(object):
def __init__(self):
pass
cls1 = Cls2()
cls2 = Cls2()
print(id(cls1) == id(cls2))
由于是面向对象的,还可以这么用
class Cls3():
pass
Cls3 = Singleton(Cls3)
cls3 = Cls3()
cls4 = Cls3()