简介:该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场
1. 最简单方式(使用模块)
Python的模块是天然单例模式
建立<font style="color:#F5222D;">explame.py</font>
文件
class mySingleton:
def test(self):
pass
mySle = 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
@mySingle
class Test1(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = Test1(2)
a2 = Test1(3)
3.基于new方法实现(方便)
我们知道,当我们实例化一个对象时,是先执行了类的new方法(我们没写时,默认调用object.new),实例化对象;然后再执行类的init方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式
import threading
class mySingle(object):
_instance_lock = threading.Lock()
def __init__(self):
pass
def __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._instance
obj1 = 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