python–类的单例模式的实现
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
使用:
1、在调度器的初始化__init__()中初始化类,则会是单例了
2、使用__new___ 设置。
1)new_ 本身用来初始化实例, 如果check 到内存中有初始化的实例则直接返回内存地址。
2) 如果check到没有实例化的实例则调用父类的__new__重新进行初始化实例, 之所以说调用父类的__new__,是因为我们实际上是重载了object的__new__
3)__new__的返回就是__init__中的self值
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
"""
在下面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。
在Python中__new__方法与__init__方法类似,但是如果两个都存在那么__new__先执行。
:param args:
:param kw:
:return:
"""
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
3、 使用metaclass
元类(metaclass)可以控制类的创建过程,它主要做三件事:
拦截类的创建
修改类的定义
返回修改后的类
用元类实现单例模式的代码如下:
class Singleton1(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton1, cls).__call__(*args, **kwargs)
return cls._instances[cls]
# Python3
class MyClass1(metaclass=Singleton1):
pass
运行
if __name__ == '__main__':
one = MyClass1()
two = MyClass1()
print( id(one), id(two))