python实现单例模式
单例模式,简单来说,就是一个类只能有一个实例,并且能够自行实例化向整个系统提供。例如文件系统和任务管理器等。
由此可见,单例模式的要点有三个:
1. 一个类只能有一个实例;
2. 它必须自行创建这个实例;
3. 它必须自行向整个系统提供这个实例
在python实现单例模式的方法总结起来有四种及其对应代码如下:
1. 魔术方法
class SingleTon(object):
"""
使用__new__实现单例模式
"""
def __new__(self, *args, **kwargs):
if not hasattr(self, '_instance'):
# 如果未实例化, 调用父类的__new__方法来实例化
self._instance = super(SingleTon, self).__new__(self, *args, **kwargs)
return self._instance
A1 = SingleTon()
A2 = SingleTon()
print(A1 is A2) #True
2. 装饰器或者类装饰器
def SingleTonByDecorator(cls):
"""
使用装饰器实现单例模式
"""
instance = {}
def wrap(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return wrap
@SingleTonByDecorator
class Bar():
def __init__(self):
# 只会执行一次
print("Init in class Bar")
A3 = Bar()
A4 = Bar()
print(A3 is A4)
# 运行结果
# Init in class Bar
# True
class SingleTonByClassDecorator(object):
"""
使用类装饰器实现单例模式
"""
def __init__(self, cls):
self.cls = cls
self._instance = None
def __call__(self, *args, **kwargs):
if None == self._instance:
self._instance = self.cls(*args, **kwargs)
return self._instance
@SingleTonByClassDecorator
class anotherBar(object):
def __init__(self):
print("Init in class anotherBar")
# 只会执行一次
A5 = anotherBar()
A6 = anotherBar()
print(A5 is A6)
# 运行结果
# Init in class anotherBar
# True
3. 元类
class SingleTonByMetaclass(type):
"""
使用元类实现单例模式
"""
def __init__(self, *args, **kwargs):
self._instance = None
super(SingleTonByMetaclass, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if self._instance is None:
self._instance = super(SingleTonByMetaclass, self).__call__(*args, **kwargs)
return self._instance
class Foo(metaclass = SingleTonByMetaclass): #单例类
# Foo(object) py2中要注意,写法稍有不同
__metaclass__ = SingleTonByMetaclass
# 代码执行到这里,元类中的__new__和__init__方法其实都已经被执行了,切只会执行一次
A7 = Foo()
A8 = Foo()
print(A7 is A8) # True
4. import:作为python模块是天然的单例模式
以上为单例模式的个人理解以及python实现的几种方法
如有错误,欢迎指正和交流!