python-单例模式
一、懒汉式–创建单例对象
1.单例模式-单线程使用
原理:重写python构造函数,先创建一个类变量初始值为None,再判断该对象是否已经实例化(判断该对象是否为None)。
若未实例化则把实例化对象赋值给类变量,后返回该类变量。
若已实例化则直接返回第一次创建的实例化对象。
class MySql:
instance = None
def __init__(self, host):
pass
def __new__(cls, *args, **kwargs):
if cls.instance: # 判断实例对象是否已经被创建-如果没创建则创建,如果创建直接返回原来的实例对象
return cls.instance
cls.instance = object.__new__(cls) # 创建空对象
return cls.instance
执行结果
<__main__.MySql object at 0x0000022BDC2447F0>
<__main__.MySql object at 0x0000022BDC2447F0>
2.单例模式-可供多线程使用
我们在以上程序中继续完善程序-为避免多线程调用时出现问题,所以在重写构造函数时加线程锁,为避免每次申请锁消耗资源所以在上面再加一层判断。
import threading
lock = threading.Lock()
class MySql:
instance = None
def __init__(self, host):
pass
def __new__(cls, *args, **kwargs):
if cls.instance: # 为避免每次查看锁消耗资源所以在上面再加一层判断
return cls.instance
with lock: # 加锁
if cls.instance: # 判断实例对象是否已经被创建-如果没创建则创建,如果创建直接返回原来的实例对象
return cls.instance
cls.instance = object.__new__(cls) # 创建空对象
return cls.instance
mysql_1 = MySql('localhost')
mysql_2 = MySql('localhost')
print(mysql_1)
print(mysql_2)
执行结果
<__main__.MySql object at 0x0000022BDC2447F0>
<__main__.MySql object at 0x0000022BDC2447F0>
二、饿汉式–创建单例对象
class MySql:
def __init__(self, host):
pass
def test(self):
pass
mysql = MySql()
# 其他程序不需要再创建实例直接调用已创建好的实例对象即可