1.理解单例模式:
单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,
通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案.
-
某个类只能有一个实例
-
它必须创建这个实例
-
它必须自行向整个系统提供这个实例
-
但是从具体角度实现来说的话,又可以分为三点
-
单例模式的类只能提供私有的构造函数
-
类定义中含有一个该类的静态私有对象
-
该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象
-
总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!
2.实现单例模式的方法:
-
使用模块
-
#test.py class MyClass(object): def foo(self): print('MyClass.foo') my_class_obj=MyClass() 将上面的代码保存在文件 test.py 中,然后这样使用: 将上面的代码保存在test.py 文件中就可以 from .test import my_class_obj my_class_obj.foo()
-
使用
__new__
-
class Teacher: flag = None def __new__(cls, *args, **kwargs): if cls.flag is None: cls.flag = object.__new__(cls) # 这一句话只能走一次 return cls.flag def __init__(self,name): self.name = name
#保证线程安全添加锁(推荐使用)
class Teacher: from threading import Lock lock = Lock() flag = None def __new__(cls, *args, **kwargs): with cls.lock: if cls.flag is None: cls.flag = object.__new__(cls) # 这一句话只能走一次 return cls.flag def __init__(self,name): self.name = name -
使用装饰器(decorator)
-
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass(object): a = 1
-
使用元类(metaclass)
-
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] # Python2 # class MyClass(object): # __metaclass__ = Singleton # Python3 class MyClass(metaclass=Singleton): pass