应用场景:
1)资源共享的情况下,避免由于资源操作时导致的性能问题或损耗等。如上述中的日志文件,应用配置。
2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
一 .模块(model)就是天然的单例
模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件
mysingleton.py
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
import mysingleton
二 .基于装饰器实现
优点: 实现简单 缺点: 多线程调用不安全
def singlem(fn):
__instans = {}
def function(*args, **kwargs):
if fn not in __instans:
__instans[fn] = fn(*args, **kwargs)
return __instans[fn]
return function
import time
@singlem
def person(a=0, b=1):
return (a, b)
print((person(1,2)))
print((person(2, 3)))
time.sleep(2)
print((person(3, 4)))
# 输出结果
(1, 2)
(1, 2)
(1, 2)
[Finished in 2.3s]
三. 基于类实现
class Singleton(object):
def __init__(self):
pass
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
Singleton._instance = Singleton(*args, **kwargs)
return Singleton._instance
四. 基于类实现-多线程时加锁
import time
import threading
class Singleton(object):
_instance_lock = threading.Lock()
def __init__(self):
time.sleep(1)
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
Singleton._instance = Singleton(*args, **kwargs)
return Singleton._instance
五.基于new方法实现(推荐使用,方便)
我们知道,当我们实例化一个对象时,是先执行了类的new方法(我们没写时,默认调用object.new),实例化对象;然后再执行类的init方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式
import threading
class Singleton(object):
_instance_lock = threading.Lock()
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
Singleton._instance = object.__new__(cls)
return Singleton._instance
附: https://blog.csdn.net/weixin_44239343/article/details/89376796