简介:该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场
1. 最简单方式(使用模块)
Python的模块是天然单例模式
建立<font style="color:#F5222D;">explame.py</font>文件
class mySingleton:def test(self):passmySle = mySingleton()
保存之后,要使用时,导入其他文件内,对象即是单例模式的对象
from testFile import mySle
2.装饰器方式
def mySingle(cls):_instance = {}def _mysingle(*args, **kargs):if cls not in _instance:_instance[cls] = cls(*args, **kargs)return _instance[cls]return _mysingle@mySingleclass Test1(object):a = 1def __init__(self, x=0):self.x = xa1 = Test1(2)a2 = Test1(3)
3.基于new方法实现(方便)
我们知道,当我们实例化一个对象时,是先执行了类的new方法(我们没写时,默认调用object.new),实例化对象;然后再执行类的init方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式
import threadingclass mySingle(object):_instance_lock = threading.Lock()def __init__(self):passdef __new__(cls, *args, **kwargs):if not hasattr(mySingle, "_instance"):with mySingle._instance_lock:if not hasattr(mySingle, "_instance"):mySingle._instance = object.__new__(cls)return mySingle._instanceobj1 = mySingle()obj2 = mySingle()print(obj1,obj2)def task(arg):obj = mySingle()print(f'{obj}---{arg}')for i in range(10):t = threading.Thread(target=task,args=[i,])t.start()==========================================================================打印结果:<__main__.mySingle object at 0x0000000002619700> <__main__.mySingle object at 0x0000000002619700><__main__.mySingle object at 0x0000000002619700>---0<__main__.mySingle object at 0x0000000002619700>---1<__main__.mySingle object at 0x0000000002619700>---2<__main__.mySingle object at 0x0000000002619700>---3<__main__.mySingle object at 0x0000000002619700>---4<__main__.mySingle object at 0x0000000002619700>---5<__main__.mySingle object at 0x0000000002619700>---6<__main__.mySingle object at 0x0000000002619700>---7<__main__.mySingle object at 0x0000000002619700>---8<__main__.mySingle object at 0x0000000002619700>---9
